Задача: Треугольник задаётся координатами своих вершин на плоскости: [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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#include <stdio.h> #include <math.h> int main(void) { double ax, ay, bx, by, cx, cy, dx, dy;//Даны по условию или нужно найти. double A1, B1, C1, A2, B2, C2, ox, oy;//Используются для вычислений. printf("Введите координаты точек A, B, C.\n"); scanf("%lf %lf %lf %lf %lf %lf\n", &ax, &ay, &bx, &by, &cx, &cy); A1=cy-by;//Постоянные из уравнения прямой BC. B1=bx-cx; C1=by*(cx-bx)-bx*(cy-by); A2=-B1;//Постоянные из уравнения прямой a. B2=A1; C2=B1*ax-A1*ay; ox=(B1*C2-B2*C1)/(A1*B2-A2*B1);//Координаты точки О. oy=(C1*A2-C2*A1)/(A1*B2-A2*B1); dx=2*ox-ax;//Координаты точки D. dy=2*oy-ay; printf("D(%lf;%lf)\n", dx, dy); return 0; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { Scanner in = new Scanner(System.in); double ax, ay, bx, by, cx, cy, dx, dy;//Даны по условию или нужно найти. double A1, B1, C1, A2, B2, C2, ox, oy;//Используются для вычислений. System.out.println("Введите координаты точек A, B, C."); ax = in.nextDouble(); ay = in.nextDouble(); bx = in.nextDouble(); by = in.nextDouble(); cx = in.nextDouble(); cy = in.nextDouble(); A1=cy-by;//Постоянные из уравнения прямой BC. B1=bx-cx; C1=by*(cx-bx)-bx*(cy-by); A2=-B1;//Постоянные из уравнения прямой a. B2=A1; C2=B1*ax-A1*ay; ox=(B1*C2-B2*C1)/(A1*B2-A2*B1);//Координаты точки О. oy=(C1*A2-C2*A1)/(A1*B2-A2*B1); dx=2*ox-ax;//Координаты точки D. dy=2*oy-ay; System.out.println("D("+dx+";"+dy+")"); } } |
Для всех переменных ([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: