Animation 检测直线与多边形的交点数
我已经在信号处理堆栈交换上问过这个问题,但没有得到任何答案。你是我唯一的希望。请帮忙,谢谢: 作为一篇数学论文的一部分,我正在编写一个程序,用于检测用输入的形状绘制的直线的交点 例如,在下面的形状中,多边形是给定大小的输入图像。光线已从多边形内开始绘制到多边形上。如何检测光线穿过多边形边界的次数 此外,多边形始终是闭合多边形 请看这里的图片: 我最初的想法是用与边框相同的颜色(黑色)填充多边形。然后计算光线与黑色和白色相遇的次数 我使用这种方法的问题是,我真的不知道如何沿着一条线跟踪和检查每个点,我猜沿着这条线连续检查是一个非常昂贵的过程Animation 检测直线与多边形的交点数,animation,math,image-processing,processing,Animation,Math,Image Processing,Processing,我已经在信号处理堆栈交换上问过这个问题,但没有得到任何答案。你是我唯一的希望。请帮忙,谢谢: 作为一篇数学论文的一部分,我正在编写一个程序,用于检测用输入的形状绘制的直线的交点 例如,在下面的形状中,多边形是给定大小的输入图像。光线已从多边形内开始绘制到多边形上。如何检测光线穿过多边形边界的次数 此外,多边形始终是闭合多边形 请看这里的图片: 我最初的想法是用与边框相同的颜色(黑色)填充多边形。然后计算光线与黑色和白色相遇的次数 我使用这种方法的问题是,我真的不知道如何沿着一条线跟踪和检查每个
我现在使用的是Processing 3,但我可以使用除MatLab之外的任何其他软件/平台,因为我现在没有访问它的权限。如果你有一条由点
p
和一个标准化方向R
以及第二条无穷线定义的无穷线,由点Q
和方向S
定义,则无休止线X
的交点为:
alpha。。。Q-P和R之间的角度
贝塔。。。R和S之间的角度
伽马=180°-α-β
h=| Q-P |*sin(α)
u=h/sin(β)
t=| Q-P |*sin(伽马)/sin(贝塔)
t=点(Q-P,(S.y,-S.x))/点(R,(S.y,-S.x))=行列式(mat2(Q-P,S))/行列式(mat2(R,S))
u=dot(Q-P,(R.y,-R.x))/dot(R,(S.y,-S.x))=行列式(mat2(Q-P,R))/行列式(mat2(R,S))
X=P+R*t=Q+S*u
另见
如果您有一个从l1p1
到l1p2
的行,以及从l2p1
到l2p2
的第二行,则:
P = l1p1
Q = l2p1;
R = normalize(l1p2 - l1p1)
S = normalize(l2p2 - l2p1)
normalize
计算向量的值。单位向量的长度是1
由于直线不是无穷无尽的,因此必须计算交点是否在线段上。计算直线的长度,以及从连接起点到交点的距离。验证距离(由计算得出)是否大于>=0和=0,distOnL1=0和distOnL2=0.0&&distOnL1=0.0&&distOnL2=0.0&&distOnL1=0.0&&distOnL2宽度-50)
移动[i].x*=-1;
if(line_p[i].y<50 | line_p[i].y>height-50)
移动[i]。y*=-1;
移动[i].x=max(-1,min(1,移动[i].x+random(0.2)-0.1));
移动[i].y=max(-1,min(1,移动[i].y+random(0.2)-0.1));
}
//清晰的背景
背景(0,0,0);
中风(255);
填充(255,0,0);
//划线
直线(直线p[0].x,直线p[0].y,直线p[1].x,直线p[1].y);
//绘制多边形和交点
整数交点=0;
对于(int i=0;i- 输入多边形图像是用非反对齐线绘制的
- 可以绘制非反对齐线(或光线)
- 线条的厚度为1像素
poly
。设置该图像的阈值,使背景像素为0,多边形像素为非零,例如1
创建一个与多边形大小相同的空图像(所有像素值为0),我们称之为光线。使用非零像素值(例如1)在此图像上绘制非反序列化光线
取这两幅图像的总和,result=poly+ray
。现在,交点在结果
图像中应有像素值2,您可以轻松提取它们的坐标
在这里,假设所有图像都有一个通道。您能轻松地将多边形“分解”为线吗?因为如果可以的话,你可以在它们身上应用一些简单的直线碰撞检测算法,你就是黄金。嗨!那是个好主意。我有过这样的想法,我还记得我曾短暂地试图找到一些现有的库或工具来实现这一点。我什么也没找到,但我还在找。您是否知道有什么可以做到这一点(最好是在处理过程中)?