1

三角形の描き方はあまり気になりませんが、三角形の辺と内心だけを知っている三角形のインデックスを見つける方法を模索してきました。

いくつかのサンプル三角形入力:

Side 1: 20
Side 2: 30
Side 3: 40
about x=100, y=400

Side 1: 20
Side 2: 40
Side 3: 50
about x=300, y=400

私自身と他の何人かの人々は、過去4時間、私たちの頭を悩ませてきましたが、役に立たなかったので、どんなヒントでも大歓迎です。

4

2 に答える 2

2

最初に把握する必要があるのは、各コーナーの位置です。あなたはそれぞれの辺の長さを持っているので、余弦定理を使うことができます...

余弦定理

...サイド1(a)サイド2(b)の間の角度を取得するには:

角度

三角形の角の位置は次のとおりです。

  • a)[0、0]
  • b)[b、0]
  • c)[c * cos(angle)、c * sin(angle)]

この後、三角形の中心に描画したいので、間違った場所から三角形が作成されます。三角形の中心の計算はさまざまな方法で行うことができますが、これは非常に単純な方法です。

centerX = (a.x + b.x + c.x) / 3
centerY = (a.y + b.y + c.y) / 3

次に、そのポイントを選択したポイントに変換できます。


これがあなたが望むことをするいくつかのコードです:

static class Triangle {
    double a, b, c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public double aAngle() {
        return Math.acos(-(Math.pow(a, 2) - Math.pow(b, 2) - Math.pow(c, 2)) / (2 * b * c));
    }

    public Point[] triangle() {

        double angle = aAngle();

        Point[] p = new Point[3];

        p[0] = new Point(0, 0);
        p[1] = new Point((int) b, 0);
        p[2] = new Point((int) (Math.cos(angle) * c), (int) (Math.sin(angle) * c));

        Point center = new Point((p[0].x + p[1].x + p[2].x) / 3, 
                                 (p[0].y + p[1].y + p[2].y) / 3);

        for (Point a : p)
            a.translate(-center.x, -center.y);

        return p;
    }
}

使用例:

public static void main(String[] args) {

    final Triangle t = new Triangle(20, 30, 40);
    final Point translation = new Point(100, 400);

    JFrame frame = new JFrame("Test");

    frame.add(new JComponent() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Point[] p = t.triangle();

            g.translate(translation.x, translation.y);

            for (int i = 0; i < p.length; i++)
                g.drawLine(p[i].x, 
                           p[i].y, 
                           p[(i+1) % p.length].x, 
                           p[(i+1) % p.length].y);
        }
    });

    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}
于 2012-10-06T08:21:40.433 に答える
0

三角関数なしでそれを行うことができます!

bエッジとcエッジの水平成分と垂直成分を考慮してください( aを水平にします)。定義により:

b x 2 + b y 2 = b 2

c x 2 + c y 2 = c 2

しかしまた、三角形の一部であるため:

b x + c x = a

b y = cy =高さ

置換:

b x 2 + b y 2
    = b x 2 + h 2
    = b 2

c x 2 + c y 2
    =( a --b x2 + h 2
    =(a 2-2ab x)+(b x 2 + h 2)     =(a 2-2ab x ) + b 2 =     c 2

これでb ​​xを見つけることができます:

b x =(a 2 + b 2 -c 2)/ 2a

そして、最初の方程式を使用します。

b y = sqrt(1-b x 2


コード内:

static class Triangle {
    double a, b, c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public Point[] coords() {
        Point[] p = new Point[3];
        double bx = (a*a + b*b - c*c) / (2*a);

        p[0] = new Point(0, 0);
        p[1] = new Point(a, 0);
        p[2] = new Point(bx, Math.sqrt(b*b - bx*bx));

        Point center = new Point(
            (p[0].x + p[1].x + p[2].x) / 3, 
            (p[0].y + p[1].y + p[2].y) / 3
        );

        for (Point a : p)
            a.translate(-center.x, -center.y);

        return p;
    }
}
于 2012-10-07T20:35:02.943 に答える