8

こんにちは、私はprocessing.jsを学んでいますが、数学の問題に遭遇しました。これは、限られた幾何学と三角法の知識やWikipediaの助けを借りても解決できないようです。

長方形を描く必要があります。この長方形を描くには、各コーナーの座標点を知る必要があります。私が知っているのは、ボックスの上部と下部の中点のxとy、および4辺すべての長さです。

ボックスの向きは保証されません。

何か助けはありますか?これは簡単なはずですが、本当に困惑しています。

4

9 に答える 9

9

この四辺形が長方形(4つの角度すべてが90度)の場合、それを解くことができます。(それが四辺形である可能性がある場合、それは解決できません)

ポイントが(x1、y1)、および(x2、y2)であり、2つのポイントが完全に垂直(x1 = x2)または水平(y1 = y2)でない場合、長方形の1つのエッジの傾きは次のようになります。

m1 = (y2-y1) / (x2-x1) 

もう一方のエッジの勾配は次のとおりです。

m2 = - 1 / m1

辺の長さ、および2つの反対側の中点がわかっている場合は、中点にdx、dyを追加することでコーナーポイントを簡単に決定できます(Lが中点が存在する辺の長さの場合)。

dx = Sqrt( L^2 / (1 + m2^2) ) / 2

dy = m2 * dx

注:ポイントが垂直または水平に整列している場合、この手法は機能しませんが、これらの退行性の場合の明らかな解決策ははるかに簡単です。

于 2010-02-08T01:37:49.733 に答える
6

四辺形が長方形であることがわかっている場合は、いくつかの簡単なベクトル計算を使用して、コーナーの座標を見つけることができます。既知のものは次のとおりです。

  • (x1,y1)-一番上の線の中点の座標
  • (x2,y2)-ボトムラインの中点の座標
  • l1-上下の線の長さ
  • l2-他の2行の長さ

まず、2つの既知の点の間のベクトルを見つけます。このベクトルはサイドラインに平行です。

(vx, vy) = (x2 - x1, y2 - y1)

このベクトルを正規化する(つまり、長さ1にする)必要があります。これにより、後で座標を見つけるための基礎として使用できます。

vlen = sqrt(vx*vx + vy*vy)

(v1x, v1y) = (vx / vlen, vy / vlen)

次に、このベクトルを反時計回りに90度回転させます。回転したベクトルは、上下の線に平行になります。90度の回転は、座標を交換し、そのうちの1つを否定するだけであることがわかります。紙で試してみるだけでわかります。または、2D回転の方程式を見て、90度で置き換えます。

(u1x, u1y) = (-v1y, v1x)

これで、「左上」のコーナーを見つけるのに十分な情報が得られました。ポイント(x1, y1)から始めて、その辺に沿って辺の長さの半分だけ戻します。

(p1x, p1y) = (x1 - u1x * l1 / 2, y1 - u1y * l1 / 2)

ここから、基底ベクトルの適切な倍数を追加するだけで、残りのポイントを見つけることができます。これを実装する場合、それぞれの一意の乗算を1回だけ計算することで、明らかに速度を上げることができます。

(p2x, p2y) = (p1x + u1x * l1, p1y + u1y * l1)

(p3x, p3y) = (p1x + v1x * l2, p1y + v1y * l2)

(p4x, p4y) = (p3x + u1x * l1, p3y + u1y * l1)

于 2010-02-08T02:22:32.727 に答える
2
  function getFirstPoint(x1,y1,x2,y2,l1,l2)
    distanceV = {x2 - x1, y2 - y1}
    vlen = math.sqrt(distanceV[1]^2 + distanceV[2]^2)
    normalized = {distanceV[1] / vlen, distanceV[2] / vlen}
    rotated = {-normalized[2], normalized[1]}
    p1 = {x1 - rotated[1] * l1 / 2, y1 - rotated[2] * l1 / 2}
    p2 = {p1[1] + rotated[1] * l1, p1[2] + rotated[2] * l1}
    p3 = {p1[1] + normalized[1] * l2, p1[2] + normalized[2] * l2}
    p4 = {p3[1] + rotated[1] * l1, p3[2] + rotated[2] * l1}
    points = { p1 , p2 , p3 , p4}
    return p1
end
于 2016-09-03T18:11:16.747 に答える
0

「四辺形」と「長方形」には違いがあります。

上下の中点と辺の長さがあれば、残りは簡単です。

与えられた:

(x1, y1) -- (top_middle_x, top_middle_y) -- (x2, y1)

(x1, y2) -- (btm_middle_x, btm_middle_y) -- (x2, y2)

上下の長さと左右の長さ。

x1 = top_middle_x-top / bottom_length / 2; x2 = x1 + top / bottom_length;

y1 = top_middle_y y2 = bottom_middle_y

明らかに、これは最も単純なケースであり、(tmx、tmy)(bmx、bmy)の線がY軸のみに沿っていると仮定しています。

その線を「正中線」と呼びます。

次のトリックは、正中線を取り、Y軸からの回転オフセットを計算することです。

今、私のトリガーは非常に錆びています。

dx = tmx-bmx、dy=tmy-bmy。

したがって、角度の接線はdy/dxです。arctangent(dy / dx)は、線の角度です。

それからあなたはあなたのオリエンテーションを得ることができます。

(念のために言っておきますが、象限や標識など、これを正しく行うためのゲームがいくつかありますが、これがその要点です。)

方向が決まったら、線をY軸に「回転」させることができます。数学のために2Dグラフィックスを調べてください、それは簡単です。

それはあなたにあなたの通常の向きを与えます。次に、この新しい通常の形式で長方形の点を計算し、最後にそれらを回転して戻します。

ビオラ。矩形。

他にできることは、「一番上の」線の半分の長さの線を、正中線の90度になるところまで「回転」させることです。つまり、45度の正中線があるとします。この線をtmx、tmyで開始し、この線を135度(90 + 45)回転させます。そのポイントが「左上」のコーナーになります。-45(45-90)回転させて、「右上」のポイントを取得します。次に、下のポイントと同様のことを行います。

于 2010-02-08T01:37:37.887 に答える
0

2つの中点の間にあるベクトルに適用されるアークタンジェント関数を使用して、2つの中点を結ぶ線の角度を計算します。

その角度から90度を引いて、上端の方向を取得します

上部の中心点から開始して、相対移動(1/2上部幅x sin(角度)、1/2上部幅x cos(角度))-右上隅の点を取得します。

必要に応じて角度と幅のsinとcosを使用して、長方形の周りを続行します

テストとして:開始点に戻ったことを確認します

于 2010-02-08T01:40:10.253 に答える
0

間違いなく長方形ですか?次に、短辺の方向(ポイント間の線に平行)、つまり長辺の方向がわかります。

あなたは長辺の方向と長さを知っていて、それらの中点を知っているので、そこから角を見つけるのは簡単です。

実装は読者の練習問題として残されています。

于 2010-02-08T01:23:18.600 に答える
0

これは、2つのポイント間の線に平行な2本の線があることを意味します。あなたが持っている線に垂直な各方向にあなたが持っている線を上面の長さの1/2に変換することによって角を取得します。

于 2010-02-08T01:23:33.310 に答える
0

上部の中点と上部の長さがわかっている場合、yは両方の上部コーナーで同じままであり、xは長方形の中点プラス/マイナスになります。これはボトムにも当てはまります。

四隅ができたら、ポイントは上下と同じなので、辺の長さを気にする必要はありません。

                         midpoint
     x,10                 10,10                   x,10
      *--------------------------------------------*
                         width = 30

    mx = midpoint x.
    top left corner = (w/2) - mx  or 15 - 10
    top left corner coords = -5,10

    mx = midpoint x.
    top right corner = (w/2) + mx  or 15 + 10
    top left corner coords = 25,10
于 2010-02-08T01:27:19.443 に答える
0
/* rcx = center x rectangle, rcy = center y rectangle, rw = width rectangle, rh = height rectangle, rr = rotation in radian from the rectangle (around it's center point) */

function toRectObjectFromCenter(rcx, rcy, rw, rh, rr){
    var a = {
        x: rcx+(Math.sin((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)), 
        y: rcy-(Math.cos((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2))
    };
    var b = {
        x: a.x+Math.cos(rr)*rw,
        y: a.y+Math.sin(rr)*rw
    };
    var c = {
        x: b.x+Math.cos(degToRad(radToDeg(rr)+90))*rh,
        y: b.y+Math.sin(degToRad(radToDeg(rr)+90))*rh
    };
    var d = {
        x: a.x+Math.cos(degToRad(radToDeg(rr)+90))*rh,
        y: a.y+Math.sin(degToRad(radToDeg(rr)+90))*rh
    };
    return {a:a,b:b,c:c,d:d};
}
于 2013-04-24T08:31:16.000 に答える