← Назад к геометрии

Биссектриса угла

Построение уравнения биссектрисы угла, заданного тремя точками

🐍 Python
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))
⚙️ 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

Попробовать онлайн

Результат появится здесь...