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/

10-14 13:37