最後に私は解決策を得ました。 手順は次のとおりです。 まず、私は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" です。長方形
のすべての側面でP'Q」とP 『Q』の交差ポイントを見つけるイム
は、最終的にあなたは、いくつかの時間のために加盟して、およびいくつかの質問を求めています。これであなたは[どのような種類の質問を避けてください](http://stackoverflow.com/help/dont-ask)を知っていなければなりません。また、[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)、[最小限の、完全で検証可能な例](http:// stackoverflow。 com/help/mcve)。 –