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

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

01.05.2024, 00:48. Показов 5685. Ответов 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,316
04.05.2024, 08:42
Цитата Сообщение от Royal_X Посмотреть сообщение
не уверен, что полностью понял, но все коэффициенты можно умножить/поделить на одно и то же число.
Уравнение вида А*Х + В*У + С = 0 можно привести к виду Х = -(В/А)*У - С/А и пересчитать коэффициенты. А. В и С могут быть разными, а отношения В/А и С/А всегда одинаковы.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
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
6302 / 3024 / 1053
Регистрация: 01.06.2021
Сообщений: 11,478
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,316
04.05.2024, 14:45
Цитата Сообщение от Royal_X Посмотреть сообщение
Собственно, такие же значения и у тебя на скриншоте.
Зто и есть результат работы вашего кода. А над ним результат работы моего другого вашего кода, рассчитывающего вторые координаты биссектрисы в виде х0, у0, р1, р2. И вот из них получить те же коэффициенты не получается...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6302 / 3024 / 1053
Регистрация: 01.06.2021
Сообщений: 11,478
04.05.2024, 14:49
alexu_007, если хочешь нарисовать биссектрису как луч, то для функции рисования отрезка в Qt тебе нужны две точки.

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

A = 80
B = -42
C = -760
Миниатюры
Биссектриса угла по 3 точкам  
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
04.05.2024, 15:11
Цитата Сообщение от Royal_X Посмотреть сообщение
т.е. одним словом, ты хочешь по двум точкам на прямой вывести три коэффициента уравнения прямой?
Двух достаточно, если пересчитать для А = 1. Тогда уравнение примет вид х = у * В + С.
Спасибо за формулу.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6302 / 3024 / 1053
Регистрация: 01.06.2021
Сообщений: 11,478
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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru