Есть ли способ узнать, пересекаются ли 3 точки в одной точке: Java - Android Studio? - PullRequest
0 голосов
/ 22 апреля 2020

Для начала у меня есть 3 балла : A, B, C Точки размещаются в сетке . Сетка на самом деле представляет собой ImageView в FrameLayout , и оба они находятся внутри RelativeLayout 3 точки расположены на RelativeLayout , поверх сетки . Теперь 3 точки представляют центр круга каждый раз с разным радиусом (не имеет значения), поэтому, когда я размещаю 3 точки, я рисую круг вокруг каждой из них. Круги нарисованы так:

            Drawable drawable = getResources().getDrawable(R.drawable.circle);
            GradientDrawable gradientDrawable = (GradientDrawable) drawable;
            gradientDrawable.setColor(getResources().getColor(android.R.color.transparent));
            gradientDrawable.setShape(GradientDrawable.OVAL);
            //Then scale it 
            gradientDrawable.setStroke(stroke,color);
            circles[i].setImageDrawable(gradientDrawable);

Теперь я теперь (x, y) из 3 точек , а также их радиус Есть ли способ узнать, пересекаются ли 3 круга в одном или нескольких пикселях? EDIT : Пример 3 окружностей, которые пересекаются в точке

1 Ответ

0 голосов
/ 06 мая 2020

У вас есть следующие данные, представляющие ваши 3 окружности:

For each circle i=1,2,3:
Center: Ci = (ai, bi)
Radius: ri > 0

Чтобы три круга имели общую точку пересечения (x, y) эта точка должна быть решением для системы квадратов c уравнения:

(x - a1)^2 + (y - b1)^2 = r1^2
(x - a2)^2 + (y - b2)^2 = r2^2
(x - a3)^2 + (y - b3)^2 = r3^2

Разверните каждое уравнение и переставьте термины:

x^2 + y^2 - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
x^2 + y^2 - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
x^2 + y^2 - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2

Одна хитрость заключается в переписывании системы следующим образом:

z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2
x^2 + y^2 = z

Это переопределенная система из трех линейных уравнений и трех неизвестных переменных (x, y, z), плюс одно дополнительное квадратичное c уравнение между этими тремя переменными x^2 + y^2 = z.

Итак, решение линейных систем легко, поэтому выполните следующее алгоритм:

Шаг 1: Сокращение линейной системы

z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2

путем вычитания первого уравнения из второго и третьего:

z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2
2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2

Шаг 2: Решите двойную линейную систему для (x, y):

2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2

и найдите решение (или решения в некоторых вырожденных случаях, но обычно быть точно одним решением) (x, y). * 103 4 *

Шаг 3: Рассчитайте z, подставив каждое решение (x, y) из шага 2 в формулу:

z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2

Шаг 4: Проверьте, если

x^2 + y^2 = z

Если это так, то три круга пересекаются в точке (x, y). Если ни одно из решений (x, y, z) из шага 3 не удовлетворяет квадратному уравнению c, то эти три круга не пересекаются.

...