0

3つの円、最初の2つの間の線を描画し、3番目の円が線に接触するか交差するかを決定する小さなプログラムを作成する必要があります。私は最後の部分を除いてすべてをしました。ポイントを使用して、面積が0であるかどうかを判断しようとしています。これは、3番目のポイントが実際に線と交差していることを意味します。右?または、別の方法を使用することもできます。技術的には、3番目の円は線から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

3番目の円の中心は(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

1つの頂点から他の2つの頂点へのベクトルを定義することで三角形の面積を計算できます(3次元空間に平面を埋め込むために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)

次に、2つのベクトルによって定義される平行四辺形の面積である、この結果のベクトルの大きさを取ります。

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

次に、2で割って、三角形の面積(平行四辺形の半分)を取得します。

ta = pa/2

出典: http: //en.wikipedia.org/wiki/Triangle_area#Using_vectors

于 2013-03-19T06:26:06.377 に答える
0

私はライトですか?お互いの円の位置は関係ありませんか?

2 つの中心点の間の線から線形関数を作成します。(ax+b=y) ここで、a は勾配、b は y 交点です。

a を 90° 回転させるのは簡単です。a を反転して否定します。

2 番目の線形関数の 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 に答える