两条线的交点算法?我有2行。两条线都包含它们的2个点X和Y。这意味着它们都有长度。我看到2个公式,一个使用行列式,一个使用普通代数。哪种计算方法最有效,公式是什么样的?我很难在我的代码中使用矩阵。这是我目前所拥有的,效率更高吗?publicstaticVector3Intersect(Vector3line1V1,Vector3line1V2,Vector3line2V1,Vector3line2V2){//Line1floatA1=line1V2.Y-line1V1.Y;浮动B1=line1V2.X-line1V1.X;浮动C1=A1*line1V1。X+B1*line1V1.Y;//Line2floatA2=line2V2.Y-line2V1.Y;浮动B2=line2V2.X-line2V1.X;浮动C2=A2*line2V1.X+B2*line2V1.Y;浮动det=A1*B2-A2*B1;if(det==0){returnnull;//平行线}else{floatx=(B2*C1-B1*C2)/det;浮动y=(A1*C2-A2*C1)/det;返回新的Vector3(x,y,0);假设你有两行Ax+By=C的形式,你可以很容易地找到它:floatdelta=A1*B2-A2*B1;if(delta==0)thrownewArgumentException("Linesareparallel");浮动x=(B2*C1-B1*C2)/增量;浮动y=(A1*C2-A2*C1)/增量;从这里把它拉出来我最近回到论文中寻找使用基本代数解决这个问题的方法。你只需要解这两条线组成的方程,如果有有效解,那么就有交集。检查此Github存储库以获取处理双精度和测试的潜在精度问题的扩展实现。publicstructLine{publicdoublex1{get;放;}publicdoubley1{得到;放;}publicdoublex2{得到;放;}publicdoubley2{得到;放;}}publicstructPoint{publicdoublex{get;放;}publicdoubley{get;放;}}publicclassLineIntersection{//如果相交则返回交点,否则默认点(空)publicstaticPointFindIntersection(LinelineA,LinelineB,doubletolerance=0.001){doublex1=lineA.x1,y1=lineA.y1;双x2=lineA.x2,y2=lineA.y2;双x3=lineB.x1,y3=lineB.y1;双x4=lineB.x2,y4=lineB.y2;//形式为x=c的方程(两条垂直线)if(Math.Abs??(x1-x2)-m1x1+y1=c1----(1)//假设第2行的方程为y2=m2x2+c2//=>-m2x2+y2=c2-----(2)//如果第1行和第2行相交,则x1=x2=x&y1=y2=y其中(x,y)是交点//所以我们将得到以下两个方程//-m1x+y=c1--------(3)//-m2x+y=c2--------(4)doublex,y;//lineA是垂直的x1=x2//斜率将是无穷大//所以让我们推导出另一个解决方案if(Math.Abs??(x1-x2)-m2x1+y=c2//=>y=c2+m2x1x=x1;y=c2+m2*x1;}//lineB是垂直的x3=x4//斜率将是无穷大//所以让我们推导出另一个解决方案elseif(Math.Abs??(x3-x4)-m1x3+y=c1//=>y=c1+m1x3x=x3;y=c1+m1*x3;}//lineA和lineB不是垂直的//(可能是水平的,我们可以用slope=0来处理)else{//计算第1行的斜率(m1)andc2doublem1=(y2-y1)/(x2-x1);doublec1=-m1*x1+y1;//计算线2(m2)andc2doublem2=(y4-y3)/(x4-x3);doublec2=-m2*x3+y3;//求解方程(3)&(4)=>x=(c1-c2)/(m2-m1)//将x值代入方程(4)=>y=c2+m2*xx=(c1-c2)/(m2-m1);y=c2+m2*x;//通过插入交叉点(x,y)//在原始方程中验证(1)&(2)查看它们是否相交//否则x,y值将不是有限的并且if(!(Math.Abs??(-m1*x+y-c1)=line.x1&&x=line.x2&&x=line.y1&&y=line.y2&&y如何找到两条线/段/光线与矩阵的交点publicclassLineEquation{publicLineEquation(Pointstart,Pointend){Start=start;End=end;IsVertical=Math.Abs??(End.X-start.X)0.0001f;if(hasIntersection){doublex=(otherLine.B*C-B*otherLine.C)/delta;doubley=(A*otherLine.C-otherLine.A*C)/delta;intersectionPoint=newPoint(x,y);}returnhasIntersection;}privatestaticPointGetIntersectionPointIfOneIsVertical(LineEquationline1,LineEquationline2){LineEquationverticalLine=line2.IsVertical?line2:line1;LineEquationnonVerticalLine=line2.IsVertical?line1:line2;doubley=(verticalLine.Start.X-nonVerticalLine.Start.X)*(nonVerticalLine.End.Y-nonVerticalLine.Start.Y)/((nonVerticalLine.End.X-nonVerticalLine.Start.X))+nonVerticalLine.Start.Y;doublex=line1.IsVertical?line1.Start.X:line2.S挞.X;返回新点(x,y);}publicboolIntersectWithSegementOfLine(LineEquationotherLine,outPointintersectionPoint){boolhasIntersection=IntersectsWithLine(otherLine,outintersectionPoint);如果(hasIntersection)返回intersectionPoint.IsBetweenTwoPoints(otherLine.Start,otherLine.End);返回假;}publicboolGetIntersectionLineForRay(Rectrectangle,outLineEquationintersectionLine){if(Start==End){intersectionLine=null;返回假;}IEnumerablelines=rectangle.GetLinesForRectangle();intersectionLine=newLineEquation(newPoint(0,0),newPoint(0,0));varintersections=newDictionary();foreach(行中的LineEquation方程){Pointpoint;if(IntersectWithSegementOfLine(equation,outpoint))交点[equation]=point;}如果(!intersections.Any())返回false;varintersectionPoints=newSortedDictionary();foreach(varintersectioninintersections){if(End.IsBetweenTwoPoints(Start,intersection.ValUE)||intersection.Value.IsBetweenTwoPoints(Start,End)){doubledistanceToPoint=Start.DistanceToPoint(intersection.Value);intersectionPoints[distanceToPoint]=intersection.Value;}}if(intersectionPoints.Count==1){PointendPoint=intersectionPoints.First().Value;intersectionLine=newLineEquation(Start,endPoint);返回真;}if(intersectionPoints.Count==2){点开始=intersectionPoints.First().Value;点结束=交叉点。最后一个()。值;intersectionLine=newLineEquation(start,end);返回真;}返回假;}publicoverridestringToString(){return"["+Start+"],["+End+"]";}}完整示例说明[点此][1]以上是C#学习教程:两条线的求交算法?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处:
