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

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

01.05.2024, 00:48. Показов 6196. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
03.05.2024, 23:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 4343H Посмотреть сообщение
я думаю, проверяющая система учитывает какой-то \eps,
какаое гвоноедство
да нам все плевать что там думает система
вы не поняли саму сутьь бессмысленности этого задания
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
03.05.2024, 23:37  [ТС]
SmallEvil, я не пойму, чем я тебе не угодил? Что ты так пассивно-агрессивно мне отвечаешь? Я учусь на программиста, мне нужно знать алгоритмы, в том числе и умение применять аналитическую геометрию. Может (вероятнее всего, т.к. я не собираюсь становиться гейм-девом), мне это и не пригодится, но база должна быть обязательно. Кто знает, куда меня жизнь заведет. А это задание - часть контеста. Контесты по программированию были, есть, и будут. Для оценки знаний есть экзамен, а контест лишь показывает, что ты умеешь применять их на практике.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
03.05.2024, 23:39
Цитата Сообщение от 4343H Посмотреть сообщение
И да, задача решена.
Где же ваше решение?
Вы заблудились ?
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
03.05.2024, 23:40  [ТС]
SmallEvil, лежит в системе, сданное
Я написал чуть повыше, что не так, и если кто хочет, доведет это до ума
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
04.05.2024, 08:42
Цитата Сообщение от Royal_X Посмотреть сообщение
не уверен, что полностью понял, но все коэффициенты можно умножить/поделить на одно и то же число.
Уравнение вида А*Х + В*У + С = 0 можно привести к виду Х = -(В/А)*У - С/А и пересчитать коэффициенты. А. В и С могут быть разными, а отношения В/А и С/А всегда одинаковы.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
04.05.2024, 14:45
Цитата Сообщение от Royal_X Посмотреть сообщение
Собственно, такие же значения и у тебя на скриншоте.
Зто и есть результат работы вашего кода. А над ним результат работы моего другого вашего кода, рассчитывающего вторые координаты биссектрисы в виде х0, у0, р1, р2. И вот из них получить те же коэффициенты не получается...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
04.05.2024, 14:49
alexu_007, если хочешь нарисовать биссектрису как луч, то для функции рисования отрезка в Qt тебе нужны две точки.

Первая точка: это 20, 20
Для нахождения второй точки, поставляешь в уравнение прямой x или y, а потом находишь y или x.
Что будешь подставлять, зависит от размеров окна для рисования. Нужно подставлять крайние значения.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
04.05.2024, 14:50
Да я нашёл уже эти вторые координаты. Первая точка 20, 20. Вторая 62, 100. Я хочу по этим координатам коэффициенты подсчитать.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
04.05.2024, 14:52
alexu_007, т.е. одним словом, ты хочешь по двум точкам на прямой вывести три коэффициента уравнения прямой?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
04.05.2024, 15:09
alexu_007, вроде правильно

A = 80
B = -42
C = -760
Миниатюры
Биссектриса угла по 3 точкам  
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
04.05.2024, 15:11
Цитата Сообщение от Royal_X Посмотреть сообщение
т.е. одним словом, ты хочешь по двум точкам на прямой вывести три коэффициента уравнения прямой?
Двух достаточно, если пересчитать для А = 1. Тогда уравнение примет вид х = у * В + С.
Спасибо за формулу.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,706
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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru