Построение уравнения биссектрисы угла, заданного тремя точками
with open('bisector.in', 'r') as fin:
b1, b2, a1, a2, c1, c2 = map(int, fin.readline().split())
from math import gcd
BA = [a1 - b1, a2 - b2]
BC = [c1 - b1, c2 - b2]
d1 = (BA[0]**2 + BA[1]**2)**0.5
d2 = (BC[0]**2 + BC[1]**2)**0.5
BA[0] /= d1
BA[1] /= d1
BC[0] /= d2
BC[1] /= d2
H = [BA[0] + BC[0], BA[1] + BC[1]]
if H == [0, 0]:
H = [-BA[1], BA[0]]
A = H[1]
B = -H[0]
C = H[0] * b2 - H[1] * b1
f = (A**2 + B**2)**0.5
A /= f
B /= f
C /= f
if C > 0:
A, B, C = -A, -B, -C
with open('bisector.out', 'w') as fout:
fout.write(str(A) + " " + str(B) + " " + str(C))
#include <bits/stdc++.h>
using namespace std;
int main() {
ifstream fin("bisector.in");
ofstream fout("bisector.out");
int b1, b2, a1, a2, c1, c2;
fin >> b1 >> b2 >> a1 >> a2 >> c1 >> c2;
double BAx = a1 - b1, BAy = a2 - b2;
double BCx = c1 - b1, BCy = c2 - b2;
double d1 = sqrt(BAx*BAx + BAy*BAy);
double d2 = sqrt(BCx*BCx + BCy*BCy);
BAx /= d1; BAy /= d1;
BCx /= d2; BCy /= d2;
double Hx = BAx + BCx;
double Hy = BAy + BCy;
if (Hx == 0 && Hy == 0) {
Hx = -BAy;
Hy = BAx;
}
double A = Hy;
double B = -Hx;
double C = Hx * b2 - Hy * b1;
double f = sqrt(A*A + B*B);
A /= f; B /= f; C /= f;
if (C > 0) {
A = -A; B = -B; C = -C;
}
fout << A << " " << B << " " << C << endl;
return 0;
}
Для угла с вершиной B и точками A и C на сторонах:
Результат — уравнение прямой в виде ax + by + c = 0, где √(a²+b²) = 1 и c ≤ 0.
Ввод: файл bisector.in содержит b1 b2 a1 a2 c1 c2
Вывод: файл bisector.out содержит коэффициенты уравнения
0 0 1 0 0 1
Угол с вершиной (0,0), стороны (1,0) и (0,1) → биссектриса y = x
Вывод: 0.7071067811865475 -0.7071067811865475 0.0