Closed. This question needs to be more focused. It is not currently accepting answers. Learn more。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
我有一个截止椭圆,我想渲染。切割部分通过与另一个椭圆相交来完成(想象另一个椭圆挡住了原始椭圆)。
参考下面的两个椭圆,其中t1,t2表示参数t1,t2,因为我跟踪椭圆,给出点p1,p2。
如何使用数据结构捕获空的部分我最初的伪代码是这样的:
for(t = 0 to 360 degrees)
{
if(point_t intersects with ellipse)
{
if(P1 is not set) set t corresponding to P1 as start_t;
else set t corresponding to P2 as end_t
}
}
然后“截止”区域将由
start_t <= t <= end_t
给出。但是,此代码只适用于第一个关系图。在第二个图表中,由于“截止”区域在范围内不是连续的,因为实际的截止区域将表示为
0 <= t <= P1 && P2 <= t <= 360 degrees
。我应该如何编写算法来解决所有这些情况?我需要一个截止部分的精确定义(例如截止的t值的范围),因为我需要使用这个值来解决这些截止椭圆的进一步的线相交问题。
最佳答案
你的图像意味着轴对齐椭圆,如果不是真的,那么在OP中指定它。
两个椭圆的交集可以创建
0完全内部/外部切断
单侧相交时切断1
如果在两侧相交,则为2个截止线
完全截止是两个椭圆相同
交点
你需要得到所有的交点
所以要么用代数/数值方法求解x0+a0*cos(t0)=x1*a1*cos(t1)
y0+b0*sin(t0)=y1*b1*sin(t1)
其中:x0,y0
为中心,a0,b0
为半轴,t0
为第一椭圆的参数。
其中:x1,y1
为中心,a1,b1
为半轴,t1
为第二椭圆的参数。
或将问题转换为线的交点
以恒定角度扫过展位椭圆
将每个椭圆转换为凸多边形
点越多,交叉点越精确
如果这些线相互重叠,则选择它们共同部分的中点
要存储哪些信息?
您需要开始-结束表单中的间隙或其余部分的参数对
所以对于每个交叉点,你需要决定它是间隙的起点还是终点
因此,您应该有一个交集参数列表,最多4个点/角度(按角度排序)
你可以忽略0,1分的情况
2分是最简单的情况
所以你的交角是ang0,ang1
其中ang0<ang1
所以只要检查点是否在第二个椭圆内
如果是,则ang0+0.01*(ang0+ang1)
是间隙的开始,ang0
是结束
所以呈现:ang1
for(t=0 ;t<=ang0 ;t+=step)...
如果不是,那就相反了for(t=ang1;t<=360deg;t+=step)...
3分案例很少见
当椭圆切割一边而只接触另一边时会发生这种情况
所以找出哪一个交角在两边的交角之外,忽略它
所以计算for(t=ang0;t<=ang1 ;t+=step)...
找到dang=0.01*min(|ang1-ang0|,|ang2-ang0|,|ang2-ang1|)
在相交点之外的接触点
然后忽略它并将其余部分作为2点案例处理
4分案例
所以计算ang? +/- dang
现在找出dang=0.01*min(|ang1-ang0|,|ang2-ang0|,|ang3-ang0|,...)
是否是gapang0
的开始
如果是,则渲染ang0-ang1
for(t=0 ;t<=ang0 ;t+=step)...
for(t=ang1;t<=ang2 ;t+=step)...
如果没有for(t=ang3;t<=360deg;t+=step)...
for(t=ang0;t<=ang1 ;t+=step)...
同形椭圆
如果两个椭圆都有相同的中心、半轴和旋转
然后切掉整个椭圆(不渲染任何内容)
统一
你可以把整个转换成存储无间隙的椭圆块
作为角度对集for(t=ang2;t<=ang3 ;t+=step)...
每个渲染的角度…
[注](start,end)
可以是任何足够小的角度步长(必须小于最小间隙),但如果它太小,则交叉点计算会给出误报
多边形转换甚至适用于无轴对齐椭圆。
如果您使用扫描,那么您已经知道交叉点是间隙的起点还是终点,因此如果知道如何使用它,您可以忽略dang
注意测角函数的弧度/度数…
如果你想用代数方法解交集,并且想避免超越函数,那么用隐式椭圆方程代替
渲染时,应处理端点角度交叉,例如
for (t=ang0;t<=ang1;t+=step)
{
if (t>=ang1) { t=ang1; e=1; } else e=0;
...
if (e) break
}
如何确定点
dang
是否在轴对齐椭圆x,y
中?首先通过转换坐标系将
x0,y0,a,b
转换为(x0,y0)
。所以问题变为:点是否在内部?
这很简单:
(0,0)
(x-x0,y-y0)
如果你有无轴对齐椭圆,然后增加旋转以匹配轴角度…
关于c# - 确定不完整椭圆的开口的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28668389/