Точка пересечения прямых

0
14 май 2016 10:33
Доброго времени суток.

Написал простенькую программу поиска точки пересечения двух прямых. Каждая из прямых задается двумя точками. Далее из этих точек выводится уравнение прямой. Далее уже ищется точка пересечения данной прямой с другой. Координату пересечения по оси X нахожу без проблем. Трудности начинаются на самом простом: подставляем найденную координату на оси X в уравнение любой из прямой и по идее я должен получить координату пересечения прямых по оси Y. Делаю я это примерно так:

       System.out.println(line1.getCrossing(line2));
       System.out.println(line2.getCrossing(line1));


Метод getCossing возвращает точку пересечения в виде объекта Point2D. Далее этот объект выводится на консоль. Координата X в обоих случаях совпадает, а вот координата Y нет, причем разница очень большая. Кто может, подскажите пожалуйста в чем ошибка. Ниже привожу код:

package detectionLinePG;

import java.awt.*;
import javax.swing.*;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

public class Lines {

    public static void main(String[] args) {
        new Lines();
    }

    public Lines() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrameForLine();
            }
        });
    }

    private class FrameForLine extends JFrame {

        private FrameForLine() {
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(600, 600);
            setLayout(null);

            Line line1 = new Line(30, 170, 100, 10);
            Line line2 = new Line(70, 300, 5, 60);
            add(line1);
            add(line2);
            System.out.println(line1.getCrossing(line2));
            System.out.println(line2.getCrossing(line1));

            setVisible(true);
        }

    }

    private class Line extends JComponent {

        private Line2D line;
        private float k;//угловой коэффициент прямой
        private float b;//точка пересечения прямой с осью ординат (с осью Y)
        private float x1;
        private float x2;
        private float y1;
        private float y2;

        private Line(float x1, float x2, float y1, float y2) {
            line = new Line2D.Float(x1, y1, x2, y2);
            k = (y2 - y1)/(x2 - x1);
            b = y1 - k * x1;

            setSize((int)Math.abs(x2 - x1), (int)Math.abs(y2 - y1));
            this.x1 = x1;
            this.x2 = x2;
            this.y1 = y1;
            this.y2 = y2;
        }

        @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.draw(line);
        }

        private Point2D getCrossing(Line otherLine) {
            if (k != otherLine.k) {
                float crossX = (b - otherLine.b)/(otherLine.k - k );
                float crossY = k * crossX + b;
                return new Point2D.Float(crossX, crossY);
            }
            return null;
        }

    }

}

Ответов: 1

2
30 май 2016 19:36
Не стал читать код.
Точка пересечения для линий вычисляется элементарно

X11, Y11, X12, Y12
X21, Y21, X22, Y22 - координаты отрезков

// параметры отрезков
a1 = Y11 - Y12; b1 = X12 - X11;
a2 = Y21 - Y22; b2 = X22 - X21;

// координаты точки пересечения
d = a1 * b2 - a2 * b1;
If ( d != 0 ) { c1 = Y12 * X11 - X12 * Y11;
c2 = Y22 * X21 - X22 * Y21;

xi = (b1 * c2 - b2 * c1) / d;
yi = (a2 * c1 - a1 * c2) / d;
}

Модераторы: Нет
Сейчас эту тему просматривают: Нет