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,您可以轻松提取它们的坐标


在这里,假设所有图像都有一个通道。

您能轻松地将多边形“分解”为线吗?因为如果可以的话,你可以在它们身上应用一些简单的直线碰撞检测算法,你就是黄金。嗨!那是个好主意。我有过这样的想法,我还记得我曾短暂地试图找到一些现有的库或工具来实现这一点。我什么也没找到,但我还在找。您是否知道有什么可以做到这一点(最好是在处理过程中)?