0

我需要做一个小程序,画三个圆,前两个之间有一条线,然后确定第三个是接触还是相交。除了最后一部分,我什么都做了。我正在尝试使用这些点来确定该区域是否为 0,这意味着第三个点实际上与线相交。正确的?或者我可以使用另一种方式。从技术上讲,第三个圆圈可以在线的 3 个像素内。问题出在标签底部附近。我将不胜感激任何将其推向另一个方向的帮助或建议。谢谢你。

import turtle

x1, y1 = eval(input("Enter coordinates for the first point x, y: "))
x2, y2 = eval(input("Enter coordinates for the second point x, y: "))
x3, y3 = eval(input("Enter coordinates for the third point x, y: "))

turtle.penup()
turtle.goto(x1, y1)
turtle.pendown()
turtle.circle(3)

turtle.penup()
turtle.goto(x2, y2)
turtle.pendown()
turtle.circle(3)

turtle.penup()
turtle.goto(x3, y3)
turtle.pendown()
turtle.circle(3)

turtle.penup()
turtle.color("red")
turtle.goto(x1, y1)
turtle.pendown()
turtle.goto(x2, y2)

a = (x1, y1)
c = (x3, y3)
#can't multiply sequence by non-int of type 'tuple'

area = (a * c) / 2    

if area == 0:
    print("Hit")
else:
    print("Miss")
4

3 回答 3

0

我是赖特吗?圆圈彼此的位置无关紧要吗?

从两个中心点之间的线做一个线性函数。(ax+b=y) 其中 a 是梯度,b 是 y 交点。

将 a 旋转 90° 很容易。逆和否定a。

求第二个线性函数的 b。b'=ya'*x 。立即将 x,y 替换为 3. 圆点的坐标。现在你有一个线性函数,它与旧函数是矩形的,第三个圆点是其中的一部分。

将旧线性函数与新线性函数相交。

你会得到很多点。3. 圆点到地段点的距离,是否大于半径。

你需要那里的功能(JS):

function makelinear (x1,y1,x2,y2){
         var temp=x2-x1;
         if(temp==0)temp=0.00000000000001;//not clean but fast.
         var a=(y2-y1)/temp,
             b=y1-a*x1;
         return[a,b];
         }
function ninetydeg(a,b,x,y){
         var aout=1/a,
             bout=y+aout*x;
         return [aout,bout];
         }
function lineintersection(a1,b1,a2,b2){
         var temp=a1-a2;
         if(temp==0)temp=0.00000000000001;
         var x=(b2-b1)/temp,
             y=a1*x+b1;
         return[x,y];
         } 
function distance(x1,y1,x2,y2){
         var x=x1-x2,
             y=y1-y2;
         return(Math.sqrt(x*x+y*y));
         }

对不起,我很复杂,我在短时间内没有找到其他解决方案。可能有一个矢量解决方案。

于 2013-04-12T12:10:17.143 回答
0

第三个圆的中心是 (x3,y3) 并且半径为 3 并且您正在尝试确定与 ([x1,y1],[x2,y2]) 线段的任何交点。

如果直线中的任何点在圆内,则存在交叉点。圆区域公式为: (x-x3)^2 + (y-y3)^2 < 3^2 你应该测试线上的每个点是否这个不等式成立,如果任何一个点满足这个条件,那么你可以得出结论线和圆相交。第一步是确定线段的坐标点(直线中 [x1,y1],[x2,y2] 点之间的所有点),然后您可以尝试循环测试这些点。

于 2013-03-19T06:23:47.540 回答
0

您可以通过定义从一个顶点到另外两个顶点的向量来计算三角形的面积(添加第三个常数坐标以将平面嵌入 ​​3 维空间(因此叉积有意义)),

#pseudocode
b = (x2, y2, 1) - (x1, y1, 1) = (x2-x1, y2-y1, 0)
c = (x3, y3, 1) - (x1, y1, 1) = (x3-x1, y3-y1, 0)

然后取这些的叉积,

a = b cross c = (by*cz-bz*cy, bz*cx-bx*cz, bx*cy-by*cx)

然后取这个结果向量的大小,它是由两个向量定义的平行四边形的面积,

pa = |a| = ax^2 + ay^2 + az^2

然后除以二得到三角形的面积(平行四边形的一半)。

ta = pa/2

来源:http ://en.wikipedia.org/wiki/Triangle_area#Using_vectors

于 2013-03-19T06:26:06.377 回答