2016-04-11 17 views
-3

Line PQと境界が与えられました。私は与えられた行に2つの平行な行を見つけなければなりませんが、行は境界を横切るべきです。また、私は平行線と指定された線との間の距離を知っています。私はP'QとP "Q"を見つける必要があります。 いずれか簡単な解決策を教えてください。 enter image description hereC++平行線を見つける境界内の座標

float vx = x2 - x1; 
    float vy = y2 - y1; 
    float mag = sqrt(vx * vx + vy * vy); 

    float t = (mag/2.0)/mag; 
    float px = (1 - t) * x1 + t * x2; 
    float py = (1 - t) * y1 + t * y2; 

私は上記のコードによってPQの中心点を発見しました。さらに、私は、既知の距離を持つ垂線を描き(px、py)、その後、その新しい線の終点を通って、その新しい線に垂直な線を引くことを計画していました(これらの線はPQに平行です)。しかし、私はそれを達成できませんでした。誰でも私を助けたり、数学を知っている方法を私に示唆することができます

+1

のすべての側面でP'Q」とP 『Q』の交差ポイントを見つけるイム

は、最終的にあなたは、いくつかの時間のために加盟して、およびいくつかの質問を求めています。これであなたは[どのような種類の質問を避けてください](http://stackoverflow.com/help/dont-ask)を知っていなければなりません。また、[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)、[最小限の、完全で検証可能な例](http:// stackoverflow。 com/help/mcve)。 –

答えて

0

最後に私は解決策を得ました。 手順は次のとおりです。 まず、私はPQの中心点を得ています。

POINT find_a_point_in_distance(float x1, float y1, float x2, float y2, float len = 0) { 
    float vx = x2 - x1; 
    float vy = y2 - y1; 
    float mag = sqrt(vx * vx + vy * vy); 

    float t = len == 0 ? ((mag/2.0)/mag) : (len/mag); 

    float px = (1 - t) * x1 + t * x2; 
    float py = (1 - t) * y1 + t * y2; 
    POINT res = { px, py }; 
    return res; 
} 

ここで(px、py)はPQの中心点である。 次に、(px、py)を通る垂線を探しています。 私はすでにPQとP'Q 'の間の距離をPQとP "Q"とも知っているという質問に言及しました。だから私は、その距離を使用して垂直線で2点を得ています。最後に私は線PQの角度を知っているので、P'Q 'とP "Q"は同じ角度でなければなりません。これらの細部を使って、線P'Q'とP "Q"を得ることができます。ここでコード下では、長方形のボックスの対角線の長さを持つ線P'Q 'とP "Q"を取得しています。

 POINT res = find_a_point_in_distance(x1, y1, x2, y2); 
     POINT res2 = find_a_point_in_distance(res.x, res.y, x2, y2, halflen); 
     float cosA = acos((res2.x - res.x)/halflen) * 180/PI; 
     float sinA = asin((res2.y - res.y)/halflen) * 180/PI; 

     float cosAngle = cos((cosA + 90.0) * PI/180.0); 
     float sinAngle = sin((sinA + 90.0) * PI/180.0); 

     float cx1 = res.x + halflen * cosAngle; 
     float cy1 = res.y + halflen * sinAngle; 

     float cosAngle2 = cos((cosA - 90.0) * PI/180.0); 
     float sinAngle2 = sin((sinA - 90.0) * PI/180.0); 

     float cx2 = res.x + halflen * cosAngle2; 
     float cy2 = res.y + halflen * sinAngle2; 


     float diagonal = sqrt(width * width + height * height); 
     float halfdiagonal = diagonal/2.0; 

     float cosAngleT = cos(cosA * PI/180.0); 
     float sinAngleT = sin(sinA * PI/180.0); 
     float cosAngleTD = cos((cosA + 180) * PI/180.0); 
     float sinAngleTD = sin((sinA + 180) * PI/180.0); 

     float cx10 = cx1 + halfdiagonal * cosAngleT; 
     float cy10 = cy1 + halfdiagonal * sinAngleT; 
     float cx11 = cx1 + halfdiagonal * cosAngleTD; 
     float cy11 = cy1 + halfdiagonal * sinAngleTD; 

     float cx20 = cx2 + halfdiagonal * cosAngleT; 
     float cy20 = cy2 + halfdiagonal * sinAngleT; 
     float cx21 = cx2 + halfdiagonal * cosAngleTD; 
     float cy21 = cy2 + halfdiagonal * sinAngleTD; 

ここ(cx10、CY10)及び(cx11、cy11)がラインP'Qである」と (CX20、cy20)及び(CX21、cy21)は、ラインP "Q" です。長方形

関連する問題