AS3 / Java - найти точку треугольника, зная другие две точки и длину сегмента - PullRequest
2 голосов
/ 08 сентября 2010

Извините, если это не имеет смысла ... Я знаю длину сегментов треугольника и координаты xy двух точек.Как мне определить xy 3-й точки?

Ответы [ 3 ]

5 голосов
/ 08 сентября 2010

Учитывая следующую картину (см .: http://local.wasp.uwa.edu.au/~pbourke/geometry/2circle/):

alt text

вот демонстрационная версия Java, где я использовал следующие имена переменных:

 picture above | Java code
---------------+----------------
 P0            | p1
 P1            | p2
 P2            | temp
 P3            | p3
 a             | a
 (a+b)         | d
 h             | h
 r0            | distanceFromP1
 r1            | distanceFromP2

public class Main {

    public static Point[] getP3(Point p1, double distanceFromP1, Point p2, double distanceFromP2) {
        double d = p1.distance(p2);

        if(d > (distanceFromP1 + distanceFromP2) || p1.equals(p2) || d < Math.abs(distanceFromP1 - distanceFromP2)) {
            // there does not exist a 3rd point, or there are an infinite amount of them
            return new Point[]{};
        }

        double a = (distanceFromP1*distanceFromP1 - distanceFromP2*distanceFromP2 + d*d) / (2*d);
        double h = Math.sqrt(distanceFromP1*distanceFromP1 - a*a);

        Point temp = new Point(p1.x + a*(p2.x - p1.x) / d, p1.y + a*(p2.y - p1.y) / d);

        return new Point[]{
                new Point(temp.x + h * (p2.y - p1.y) / d, temp.y - h * (p2.x - p1.x) / d),
                new Point(temp.x - h * (p2.y - p1.y) / d, temp.y + h * (p2.x - p1.x) / d)
        };
    }

    public static void main(String[]args) throws Exception {
        Point a = new Point(1,1);
        Point b = new Point(5,4);
        Point c = new Point(0,0);
        Point d = new Point(2,0);
        System.out.println("test 1 :: "+Arrays.toString(getP3(a, 4, b, 3)));       // 2 distinct 3rd points
        System.out.println("test 2 :: "+Arrays.toString(getP3(c, 1, d, 1)));       // 1 distinct 3rd point
        System.out.println("test 3 :: "+Arrays.toString(getP3(c, 0.99999, d, 1))); // none
        System.out.println("test 4 :: "+Arrays.toString(getP3(d, 1, d, 1)));       // infinite
        System.out.println("test 5 :: "+Arrays.toString(getP3(c, 50, d, 1)));      // none, one circle "contains" the other
    }
}

class Point {

    final double x;
    final double y;
    private final int hash;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
        this.hash = Double.valueOf(x).hashCode() ^ Double.valueOf(y).hashCode();
    }

    public double distance(Point that) {
        double dX = this.x - that.x;
        double dY = this.y - that.y;
        return Math.sqrt(dX*dX + dY*dY);
    }

    @Override
    public boolean equals(Object o) {
        if(o == null || getClass() != o.getClass()) return false;
        Point that = (Point)o;
        return this.x == that.x && this.y == that.y;
    }

    @Override
    public int hashCode() {
        return  hash;
    }

    @Override
    public String toString() {
        return String.format("(x=%f, y=%f)", x, y);
    }
}

, который выдаст следующий вывод:

test 1 :: [(x=5.000000, y=1.000000), (x=2.120000, y=4.840000)]
test 2 :: [(x=1.000000, y=0.000000), (x=1.000000, y=0.000000)]
test 3 :: []
test 4 :: []
test 5 :: []

Обратите внимание, что вышеприведенное просто демонстрация. Будьте осторожны со сравнениями с плавающей запятой!

2 голосов
/ 08 сентября 2010

Вы можете рассматривать линии с неизвестными конечными точками как радиус дуг с центрами, а затем известные точки, которые затем можно довольно легко рассчитать для пересечения двух дуг.Для каждого случая будет два возможных ответа.

http://mathworld.wolfram.com/Circle-CircleIntersection.html

Редактировать

Вот еще один способ, который вам может быть проще выполнить.

http://local.wasp.uwa.edu.au/~pbourke/geometry/2circle/

Редактировать 2

Я вижу, Барт избил меня до второго сайта.

0 голосов
/ 08 сентября 2010

Расширение Ответ Джейди пусть

  1. две известные точки равны (0,0) и (0, d);
  2. R - длинаотрезок от (0,0) до неизвестной точки;
  3. r - длина отрезка от (0, d) до неизвестной точки;

Затем вычислите x иa используя уравнения 5 и 9, приведенные в http://mathworld.wolfram.com/Circle-CircleIntersection.html. Рассчитайте y = a / 2.Есть 2 возможных точки для завершения треугольника: (x, y) и (x, -y).

Кодировка (не проверено)

double x ( double d , double R , double r )
{
    return ( d * d - r * r + R * R ) / ( 2 * d ) ;
}

double a ( double d , double R , double r )
{
    return ( Math . sqrt ( ( - d + r - R ) * ( -d - r + R ) * ( - d + r + R ) * ( d + r + R ) ) / d ) ;
}

double y ( double d , double R , double r )
{
    return a ( d , R , r ) / 2 ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...