помоги мне решить задачу по алгоритмам и структура...
創建於:2025年10月24日
使用 GPT-5 Thinking 回答 Chat01
創建於:2025年10月24日
使用 GPT-5 Thinking 回答 Chat01
помоги мне решить задачу по алгоритмам и структурам данных на языке программирования C++
напиши примитивное решение! также пиши код в моём стиле: не используй using namespace std; используй стандартные include (не используй «#include <bits/stdc++.h>»); без сильной необходимости не используй глобальные переменные (все переменные должны быть в main); требования к названиям переменных: названия переменных должны быть развёрнутыми (так чтобы было понятно что в них хранится и какой смысл они несут), но сильно длинными названия переменных не делай, названия пиши без заглавных букв, если в названии используются несколько слов, то разделяй их нижним подчёркиванием («_»); не используй болшие классы и сруктуры с различными методами (для удобства можно использовать только маленькие классы и структуры); в коде обязательно должна присутствовать отдельная функция (функции), в которой (которых) происходит основное решение задачи, возможно наличие вспомогательных функций (то есть весь код не должен быть написан в main, в main напиши считывание входных данных и «подготовку» к решению); не используй лямбда-функции, вместо них пиши отдельные функции; весь код пиши под версию C++20, не использую без сильной необходимости старый стиль написания кода и старые
в задаче даны три точки X, Y, Z. Нужно вывести коэффициенты прямой , являющейся внутренней биссектрисой угла (вершина в X).
Идея простая: возьмём единичные векторы вдоль лучей и , их сумма даёт направление внутренней биссектрисы. Зная направление и точку X, получаем уравнение прямой. Для устойчивости нормируем и фиксируем знак (делаем или при — ).
Вот «примитивное» решение в вашем стиле:
cpp#include <iostream> #include <iomanip> #include <cmath> struct point { double x; double y; }; double vector_length(double dx, double dy) { return std::hypot(dx, dy); } void compute_internal_bisector_coefficients( const point& point_x, const point& point_y, const point& point_z, double& a_out, double& b_out, double& c_out) { // векторы лучей XY и XZ double xy_dx = point_y.x - point_x.x; double xy_dy = point_y.y - point_x.y; double xz_dx = point_z.x - point_x.x; double xz_dy = point_z.y - point_x.y; // единичные векторы double xy_len = vector_length(xy_dx, xy_dy); double xz_len = vector_length(xz_dx, xz_dy); // предполагаем, что данные не вырожденные (длины > 0) double unit_xy_dx = xy_dx / xy_len; double unit_xy_dy = xy_dy / xy_len; double unit_xz_dx = xz_dx / xz_len; double unit_xz_dy = xz_dy / xz_len; // направление внутренней биссектрисы — сумма единичных векторов double dir_dx = unit_xy_dx + unit_xz_dx; double dir_dy = unit_xy_dy + unit_xz_dy; // нормаль к биссектрисе (a,b) = (-dy, dx) double a = -dir_dy; double b = dir_dx; double c = -(a * point_x.x + b * point_x.y); // нормируем, чтобы убрать произвольный множитель double norm = std::hypot(a, b); a /= norm; b /= norm; c /= norm; // фиксируем знак, чтобы ответ был однозначным const double eps = 1e-12; if (a < -eps || (std::abs(a) <= eps && b < -eps)) { a = -a; b = -b; c = -c; } a_out = a; b_out = b; c_out = c; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); point point_x, point_y, point_z; std::cin >> point_x.x >> point_x.y >> point_y.x >> point_y.y >> point_z.x >> point_z.y; double a, b, c; compute_internal_bisector_coefficients(point_x, point_y, point_z, a, b, c); std::cout << std::fixed << std::setprecision(5) << a << ' ' << b << ' ' << c << '\n'; return 0; }
Замечания:
#include <iostream>
#include <cmath>
#include <iomanip>
struct point {
double x;
double y;
};
double vector_len(double dx, double dy) {
return std::hypot(dx, dy);
}
void comp_interval(const point &point_x, const point &point_y, const point &point_z, double &a_out, double &b_out, double &c_out) {
double xy_dx = point_y.x - point_x.x;
double xy_dy = point_y.y - point_x.y;
double xz_dx = point_z.x - point_x.x;
double xz_dy = point_z.y - point_x.x;
textdouble xy_len = vector_len(xy_dx, xy_dy); double xz_len = vector_len(xz_dx, xz_dy); double unit_xy_dx = xy_dx / xy_len; double unit_xy_dy = xy_dy / xy_len; double unit_xz_dx = xz_dx / xz_len; double unit_xz_dy = xz_dy / xz_len; double dir_dx = unit_xy_dx + unit_xz_dx; double dir_dy = unit_xy_dy + unit_xz_dy; double a = -dir_dy; double b = dir_dx; double c = -(a * point_x.x + b * point_x.y); double norm = std::hypot(a, b); a /= norm; b /= norm; c /= norm; const double eps = 1e-12; if (a < -eps || (std::abs(a) <= eps && b < -eps)) { a = -a; b = -b; c = -c; } a_out = a; b_out = b; c_out = c;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
textpoint point_x, point_y, point_z; std::cin >> point_x.x >> point_x.y; std::cin >> point_y.x >> point_y.y; std::cin >> point_z.x >> point_z.y; double a, b, c; comp_interval(point_x, point_y, point_z, a, b, c); std::cout << std::fixed << std::setprecision(5) << a << " " << b << " " << c;
}
вот мой код, мне выдало ошибку, исправь
у тебя опечатка в вычислении xz_dy — вычитаешь point_x.x вместо point_x.y. из-за этого направление биссектрисы получается неверным. вот исправленный вариант (остальное оставил как есть):
cpp#include <iostream> #include <cmath> #include <iomanip> struct point { double x; double y; }; double vector_len(double dx, double dy) { return std::hypot(dx, dy); } void comp_interval(const point &point_x, const point &point_y, const point &point_z, double &a_out, double &b_out, double &c_out) { double xy_dx = point_y.x - point_x.x; double xy_dy = point_y.y - point_x.y; double xz_dx = point_z.x - point_x.x; double xz_dy = point_z.y - point_x.y; // <-- исправлено double xy_len = vector_len(xy_dx, xy_dy); double xz_len = vector_len(xz_dx, xz_dy); double unit_xy_dx = xy_dx / xy_len; double unit_xy_dy = xy_dy / xy_len; double unit_xz_dx = xz_dx / xz_len; double unit_xz_dy = xz_dy / xz_len; double dir_dx = unit_xy_dx + unit_xz_dx; double dir_dy = unit_xy_dy + unit_xz_dy; double a = -dir_dy; double b = dir_dx; double c = -(a * point_x.x + b * point_x.y); double norm = std::hypot(a, b); a /= norm; b /= norm; c /= norm; const double eps = 1e-12; if (a < -eps || (std::abs(a) <= eps && b < -eps)) { a = -a; b = -b; c = -c; } a_out = a; b_out = b; c_out = c; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); point point_x, point_y, point_z; std::cin >> point_x.x >> point_x.y; std::cin >> point_y.x >> point_y.y; std::cin >> point_z.x >> point_z.y; double a, b, c; comp_interval(point_x, point_y, point_z, a, b, c); std::cout << std::fixed << std::setprecision(5) << a << " " << b << " " << c << '\n'; }
если ещё что-то падает — пришли конкретный тест, посмотрим вырожденные случаи.