龟线交汇处,坐标

时间:2013-03-19 06:03:33

标签: coordinates intersect

我需要制作一个小程序,绘制三个圆,前两个之间的一条线,然后确定第三个是否接触或相交该线。除了最后一部分我完成了所有工作。我试图使用这些点来确定该区域是否为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")

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

#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

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

ta = pa/2

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

答案 2 :(得分:0)

我怀疑吗?圆圈相互之间的位置无关紧要?

从两个中心点之间的线创建线性函数。 (AX + B = Y) 其中a是渐变,b是y交叉。

旋转90°很容易。反向和否定a。

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

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

你会得到重点。 您需要找出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));
         }

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