С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117

Биссектриса угла по 3 точкам

01.05.2024, 00:48. Показов 5084. Ответов 54

Студворк — интернет-сервис помощи студентам
Задаются 3 точки X(x1, y1), Y(x2, y2), Z(x2, y2) в следующем формате: x1 y1 x2 y2 x3 y3. Выдать 3 коэффициента уравнения биссектрисы угла YXZ (уравнение вида Ax + By + C = 0). Вот мой код:

C++
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
 
#define PI acos(-1.0)
 
#define fast_cin() std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL)
#define precise_cout std::cout << std::setprecision(12)
 
class Point {
public:
    explicit Point(double _x = 0, double _y = 0) : x(_x), y(_y) {};
 
    void read_point() { std::cin >> x >> y; }
 
    void print_point() const {
        std::cout << "(" << x << "," << y << ")" << " ";
    }
 
    Point operator+(const Point &other) const {
        return Point(x + other.x, y + other.y);
    }
 
    Point operator-(const Point &other) const {
        return Point(x - other.x, y - other.y);
    }
 
    Point operator/(double num) const { // На 0 поделим, получим NaN - ибо нефиг так делить
        return Point(x / num, y / num);
    }
 
    Point operator*(double num) const {
        return Point(x * num, y * num);
    }
 
 
public:
    double x, y;
};
 
class Line {
public:
    explicit Line(double _a = 0, double _b = 0, double _c = 0) : A(_a), B(_b), C(_c) {}; // По коэффициентам
    Line(Point a, Point b) : A(b.y - a.y), B(a.x - b.x), C(-(A * a.x + B * a.y)) {}; // Две точки
    Line(Point a, Vector v) : A(v.b.x), B(v.b.y), C(-(A * a.x + B * a.y)) {}; // Точка и вектор нормали к этой прямой
 
    [[nodiscard]] bool is_point_on_the_line(Point p) const {
        return A * p.x + B * p.y + C == 0;
    }
 
    [[nodiscard]] bool are_two_points_on_the_same_side_of_line(Point p1, Point p2) const {
        return (A * p1.x + B * p1.y + C) * (A * p2.x + B * p2.y + C) > 0;
    }
 
    [[nodiscard]] Line get_perpendicular_line(Point p) const {
        double a = B, b = -A, c = -a * p.x - b * p.y;
        return Line(a, b, c);
    }
 
    [[nodiscard]] Line get_line_on_dist(double dist) const {
        return Line(A, B, dist * sqrt(pow(A, 2) + pow(B, 2)) + C);
    }
 
    [[nodiscard]] double get_dist_to_point(Point p) const {
        return std::abs(A * p.x + B * p.y + C) / sqrt(pow(A, 2) + pow(B, 2));
    }
 
    void print_line_equation_coefficients() const {
        precise_cout << A << " " << B << " " << C << "\n";
    }
 
    void read_line_equation_coefficients() {
        std::cin >> A >> B >> C;
    }
 
public:
    double A, B, C;
};
 
double sq(Line l) {
    return sqrt(pow(l.A, 2) + pow(l.B, 2));
}
 
int main() {
    fast_cin();
 
    Point x, y, z;
    x.read_point();
    y.read_point();
    z.read_point();
 
    Line XY(x, y), XZ(x, z);
 
    double t1 = sq(XY), t2 = sq(XZ);
 
    auto b1 = Line(XY.A * t2 + XZ.A * t1, XY.B * t2 + XZ.B * t1, XY.C * t2 + XZ.C * t1),
            b2 = Line(XY.A * t2 - XZ.A * t1, XY.B * t2 - XZ.B * t1, XY.C * t2 - XZ.C * t1);
 
    if (!b1.are_two_points_on_the_same_side_of_line(y, z)) {
        b1.print_line_equation_coefficients();
    } else { b2.print_line_equation_coefficients(); }
    return 0;
}
Вроде как делал, все как по статье: https://treugolniki.ru/uravnen... k751221194
А тесты не проходит... Что тут может быть не так? Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2024, 00:48
Ответы с готовыми решениями:

Биссектриса угла на плоскости Лобачевского
Нужно построить биссектрису угла, который задан тремя локаторами. Вот начатая программа. Но возникает проблема: Практически любое...

Биссектриса угла, заданного тремя точками
имеем три точки A, B, C. необходимо нарисовать биссектрису угла ABC. кто подскажет решение. а то я уже зашел в тупик. попробовал...

Биссектриса угла между двумя прямыми
Добрый день! В случае прохождения прямых через т.(0,0) выдает ошибку: ivide by zero encountered in double_scalars ...

54
Заблокирован
03.05.2024, 23:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 4343H Посмотреть сообщение
я думаю, проверяющая система учитывает какой-то \eps,
какаое гвоноедство
да нам все плевать что там думает система
вы не поняли саму сутьь бессмысленности этого задания
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
03.05.2024, 23:37  [ТС]
SmallEvil, я не пойму, чем я тебе не угодил? Что ты так пассивно-агрессивно мне отвечаешь? Я учусь на программиста, мне нужно знать алгоритмы, в том числе и умение применять аналитическую геометрию. Может (вероятнее всего, т.к. я не собираюсь становиться гейм-девом), мне это и не пригодится, но база должна быть обязательно. Кто знает, куда меня жизнь заведет. А это задание - часть контеста. Контесты по программированию были, есть, и будут. Для оценки знаний есть экзамен, а контест лишь показывает, что ты умеешь применять их на практике.
0
Заблокирован
03.05.2024, 23:39
Цитата Сообщение от 4343H Посмотреть сообщение
И да, задача решена.
Где же ваше решение?
Вы заблудились ?
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
03.05.2024, 23:40  [ТС]
SmallEvil, лежит в системе, сданное
Я написал чуть повыше, что не так, и если кто хочет, доведет это до ума
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
04.05.2024, 08:42
Цитата Сообщение от Royal_X Посмотреть сообщение
не уверен, что полностью понял, но все коэффициенты можно умножить/поделить на одно и то же число.
Уравнение вида А*Х + В*У + С = 0 можно привести к виду Х = -(В/А)*У - С/А и пересчитать коэффициенты. А. В и С могут быть разными, а отношения В/А и С/А всегда одинаковы.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
04.05.2024, 14:26
Я че то запутался в простой арифметике. На рисунке у меня угол с координатами, начальные координаты угла 20,20. По формулам рассчитываются координаты второй точки биссектрисы, для у = 100 х = 62. По этим координатам нарисована красная линия (биссектриса), и видно, что она делит угол правильно пополам. Проблема возникает при попытке применить формулу из https://mathter.pro/angem/2_2_... ktoru.html
(х - х0)/р1 = (у - у0)/р2

(х - 20) / 62 = (у - 20) / 100
100х - 2000 = 62у - 1240
100х = 62у + 760
х = 0.62у + 7.6

Но при подстановке у = 100 выдает неверный ответ, мешает эта самая +7.6. Для угла с началом координат 0,0 считает правильно. Где я ошибаюсь?
Миниатюры
Биссектриса угла по 3 точкам  
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 14:39
alexu_007, я не совсем понял, что ты хочешь?

По вышеприведенному мной коду для нахождения коэффициентов, для твоих точек я получаю:
A = -1.32127
B = 0.693794
C = -12.5494

Таким образом, уравнение прямой:
-1.32127 * x + 0.693794 * y - 12.5494 = 0

Собственно, такие же значения и у тебя на скриншоте.

Ты хочешь, чтобы биссектриса полностью находилась внутри треугольника или чтобы она выглядела как луч?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
04.05.2024, 14:45
Цитата Сообщение от Royal_X Посмотреть сообщение
Собственно, такие же значения и у тебя на скриншоте.
Зто и есть результат работы вашего кода. А над ним результат работы моего другого вашего кода, рассчитывающего вторые координаты биссектрисы в виде х0, у0, р1, р2. И вот из них получить те же коэффициенты не получается...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 14:49
alexu_007, если хочешь нарисовать биссектрису как луч, то для функции рисования отрезка в Qt тебе нужны две точки.

Первая точка: это 20, 20
Для нахождения второй точки, поставляешь в уравнение прямой x или y, а потом находишь y или x.
Что будешь подставлять, зависит от размеров окна для рисования. Нужно подставлять крайние значения.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
04.05.2024, 14:50
Да я нашёл уже эти вторые координаты. Первая точка 20, 20. Вторая 62, 100. Я хочу по этим координатам коэффициенты подсчитать.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 14:52
alexu_007, т.е. одним словом, ты хочешь по двум точкам на прямой вывести три коэффициента уравнения прямой?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 14:57
alexu_007, вот формула

по этой формуле получаешь каноническое уравнение, а оттуда отделить коэффициенты не составит труда
(x - xa) (yb - ya) - (y - ya) (xb - xa) =0
xa = 20
ya = 20
xb = 62
yb = 100
Получается 80 x - 42 y - 760 = 0

Предыдущая формула была для других целей. То была для нахождения канонического уравнения по точке и направляющему вектору.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 15:09
alexu_007, вроде правильно

A = 80
B = -42
C = -760
Миниатюры
Биссектриса угла по 3 точкам  
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
04.05.2024, 15:11
Цитата Сообщение от Royal_X Посмотреть сообщение
т.е. одним словом, ты хочешь по двум точкам на прямой вывести три коэффициента уравнения прямой?
Двух достаточно, если пересчитать для А = 1. Тогда уравнение примет вид х = у * В + С.
Спасибо за формулу.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,345
04.05.2024, 15:12
alexu_007, но можно упростить коэффициенты, не нарушив целостность

A = 40
B = -21
C = -380
Миниатюры
Биссектриса угла по 3 точкам  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2024, 15:12
Помогаю со студенческими работами здесь

Найти координаты угла в прямоугольном треугольнике по двум точкам
Дан прямоугольный треугольник ABC. C - прямой угол. Известны координаты точек A и B, а также Cy. Необходимо найти Cx. Подскажите...

Разработать функцию, вычисляющую величину угла по трём точкам на плоскости
Разработать функцию, вычисляющую величину угла по трём точкам на плоскости, задающим его лучи. Ввести координаты вершин трёх...

Биссектриса в треугольнике
помогите пожалуйста решением

Биссектриса Треугольника С# (Си Шарп)
Всем здравствуйте. Помогите пожалуйста решить задачу. Необходимо найти биссектрису треугольника. Я принципе вроде бы решил, но почему-то не...

Биссектриса, внешний угол
биссектрисы внешних углов при вершинах B и С треугольника ABC пересекаются в точке O . Доказать ,что биссектриса угла BAC проходит через O.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru