Ю1.27

Задача: Треугольник задаётся координатами своих вершин на плоскости: [latex]A\left(x_{1};y_{1} \right), B\left(x_{2};y_{2} \right), C\left(x_{3};y_{3} \right)[/latex] . Найти точку [latex]D[/latex], симметричную точке [latex]A[/latex] относительно стороны [latex]BC[/latex].

[latex]a_{x}[/latex] [latex]a_{y}[/latex] [latex]b_{x}[/latex] [latex]b_{y}[/latex] [latex]c_{x}[/latex] [latex]c_{y}[/latex] [latex]d_{x}[/latex] [latex]d_{y}[/latex]
2 2 0 0 1 0 2 -2
-4 5 -2 3 -2 2 0 5
-3 -3 -4 -1 -1 -4 -2 -2
5 2 3.5 1 4.5 4 2.9 2.7

C++:

Java:

Для всех переменных ([latex]a_{x}[/latex], [latex]a_{y}[/latex], [latex]b_{x}[/latex], [latex]b_{y}[/latex], [latex]c_{x}[/latex], [latex]c_{y}[/latex] — координаты точек [latex]A, B, C[/latex], даны по условию; [latex]d_{x}[/latex], [latex]d_{y}[/latex] — координаты точки [latex]D[/latex] — нужно найти) я использовала тип double, так как они могут быть вещественными числами.

Найдём уравнение прямой [latex]BC[/latex] по формуле [latex]\frac{\left(x-x_{1} \right)}{\left(x_{2}-x_{1} \right)}=\frac{\left(y-y_{1} \right)}{\left(y_{2}-y_{1} \right)}[/latex]. Подставляем значения: [latex]\frac{\left(x-b_{x} \right)}{\left(c_{x}-b_{x} \right)}=\frac{\left(y-b_{y} \right)}{\left(c_{y}-b_{y} \right)}[/latex]. Приводим к виду: [latex]x\left(c_{y}-b_{y} \right)-y\left(c_{x}-b_{x} \right)+b_{y}\left(c_{x}-b_{x} \right)-b_{x}\left(c_{y}-b_{y} \right)=0[/latex].
Переменными [latex]A_{1}[/latex],  [latex]B_{1}[/latex],  [latex]C_{1}[/latex]  я обозначила постоянные при [latex]x, y[/latex] и свободный член, чтобы уравнение приняло вид: [latex]A_{1}\cdot x+B_{1}\cdot y+C_{1}=0[/latex].

Проведём прямую через точку [latex]A[/latex] перпендикулярно прямой [latex]BC[/latex]. Составим её уравнение по формуле: [latex]A\left(y-a_{y} \right)-B\left(x-a_{x} \right)=0[/latex]. Получим: [latex]A_{1}\cdot y-B_{1}\cdot x+B_{1}\cdot a_{x}-A_{1}\cdot a_{x}=0[/latex].  Аналогично для постоянных в этом уравнении я использовала переменные [latex]A_{2}[/latex],  [latex]B_{2}[/latex],  [latex]C_{2}[/latex]. Соответственно, [latex]A_{2}=-B_{1}[/latex],   [latex]B_{2}=A_{1}[/latex],   [latex]C_{2}=B_{1}\cdot a_{x}-A_{1}\cdot a_{y}[/latex].

Теперь найдём точку пересечения этой прямой и прямой  [latex]BC[/latex] — точку [latex]O\left(o_{x};o_{y} \right)[/latex]. Получим: [latex]o_{x}=\frac{B_{1}\cdot C_{2}-B_{2}\cdot C_{1}}{A_{1}\cdot B_{2}-A_{2}\cdot B_{1}}[/latex]   и   [latex]o_{y}=\frac{C_{1}\cdot A_{2}-C_{2}\cdot A_{1}}{A_{1}\cdot B_{2}-A_{2}\cdot B_{1}}[/latex].

Так как точка [latex]D[/latex] симметрична точке [latex]A[/latex] относительно [latex]BC[/latex], и [latex]AD[/latex] пересекается с [latex]BC[/latex] в точке [latex]O[/latex]: точка [latex]O[/latex] — середина [latex]AD[/latex]. Из формулы координаты середины отрезка (  [latex]o_{x}=\frac{a_{x}+d_{x}}{2}[/latex] и [latex]o_{y}=\frac{a_{y}+d_{y}}{2}[/latex]  ) находим [latex]d_{x}=2\cdot o_{x}-a_{x}[/latex]  и  [latex]d_{y}=2\cdot o_{y}-a_{y}[/latex].

Задача на Ideone:
C++
Java

Related Images:

10 thoughts on “Ю1.27

  1. Во-первых, молодец. Но, во-вторых…
    — для возведения во вторую степень не стоит привлекать функцию pow — лучше просто умножить число само на себя.
    — тесты проверяют далеко не все «опасные» ситуации. Например, объясните, почему отобразив симметрично оси Ох точку А(2,2) Вы получаете D(-7.777778;-10), а не D(2,-2)? Проверьте на таких данных 2 2 0 0 1 0.

  2. Можно было сделать проще, если изначально повернуть все точки на такой угол чтобы прямая BC стала параллельной оси OX, тогда все что нам нужно это просто отнять от повернутого yA повернутое yB и от yB отнять результат. Все что нам останется сделать — это повернуть полученную точку в обратную сторону.

    • Повернуть относительно точки B*

    • Вы полагаете, что повернуть все точки будет проще?
      Не сложнее построить уравнение прямой BC. Написать уравнение прямой перпендикулярной BC и проходящей через точку A. Найти координаты их пересечения и отобразить A симметрично. Все формулы есть здесь.
      Но Полина использует геометрический подход, который ни чем не хуже. Только эту простую геометрическую задачу нужно решить аккуратно. А для этого обязательно построить правильный чертёж.

  3. Полина, Вы не написали исправили ли ошибку, но поставили отметку «Нуждается в проверке».
    Проверил на том же тесте «2 2 0 0 1 0».
    Получил D(-0.883037;-2.000000)
    Должен был получить D(2,-2).

    Пожалуйста, добавьте этот тест и добейтесь, чтобы Ваша программа его проходила.
    Если не получается, посоветуйтесь с Александром Сергеевичем на занятиях или по почте.

    • Предыдущий вариант решения никак не получалось сделать правильным, поэтому я всё переделала так, как вы написали.

    • Для наглядности напрашивается чертеж (рисунок).

      Проведём прямую через точку A перпендикулярно прямой BC. Составим её уравнение по формуле:
      и далее в этой формуле, наверное, должно быть A1 и B1 (и в следующих формулах тоже). По крайней мере так выходит из формул для A2, B2, C2. Кстати, в математических формулах, в отличии от программы, единица и двойка в A1, B1, C1, A2, B2, C2 должна быть нижним индексом. Опять же ax должна быть в математических формулах а с нижним индексом x и т.д.

Добавить комментарий