Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 21.11.2021
Сообщений: 3

Окружность Фейербаха

21.11.2021, 22:37. Показов 889. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Текст задачи:
Проверить справедливость утверждения, что середины сторон плоского треугольника, основания его высот и середины отрезков, соединяющих точку пересечения высот с каждой из вершин, лежат на одной окружности (окружности девяти точек или окружности Фейербаха), центром которой является середина отрезка , соединяющего точку пересечения высот треугольника и точку пересечения перпендикуляров, проходящих через середины его сторон. Определить координаты центра и радиус окружности Фейербаха для треугольника, заданного координатами своих вершин х1,х2,х3,у1,у2,у3, где хi,уi (i=1,2,3) - действительные числа. Определить подпрограммы, необходимые для решения задачи.

Имею на руках данный код (на простом C, но в целом и ответ на С++ мне подойдет, поэтому тема тут), который в целом отрабатывает и выдает результат, но как оценить правильно он это делает или нет для меня загадка (бьюсь уже который час, не приходит в голову нужная мысль).
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
float m1 (float x1, float y1, float x2, float y2, float x3, float y3, float s)
{ float x0, t=-4;
x0=((x1*x1+y1*y1)*(y2-y3)-y1*(x2*x2+y2*y2-x3*x3-y3*y3)+y3*(x2*x2+y2*y2)-y2*(x3*x3+y3*y3))/(t*s);
return x0;
}
float m2 (float x1, float y1, float x2, float y2, float x3, float y3, float s)
{ float y0;
  y0=((x1*x1+y1*y1)*(x2-x3)-x1*(x2*x2+y2*y2-x3*x3-y3*y3)+x3*(x2*x2+y2*y2)-x2*(x3*x3-y3*y3))/(4*s);
  return y0;
}
float g1 (float x1, float y1, float x2, float y2, float x3, float y3)
{ float g10;
g10=(x3*x2*x2-x3*x3*x2+x1*x2*x3-x1*x2*x2-y2*y3*x3+x2*y2*y3+y3+y1*y2*x3-x2*y1*y2+x1*x3*x3-x1*x3*x1+x2*x1*x3-x2*x1*x1-y3*y1*x3+x1*y1*y3+x3*y1*y2-x1*y1*y2)/(y3*x2-y3*x3+y1*x3-y1*x2-x3*y3+x1*y3+x3*y2-x1*y2);
return g10;
}
float g2 (float q, float x1, float y1, float x2, float y2, float x3, float y3)
{ float g20;
  g20=(x3*x2-x1*x2+y2*y3-y1*y2-q*(y3-y1))/(x3-x1);
  return g20;
}
// ^^^ формулы для окружности Фейербаха
 
void main()
{ float x1,y1,x2,y2,x3,y3,a,b,c,s,p,q,e,f,r,R,x0,y0,g10,g20,d1,d2;
  setlocale(LC_ALL, "Russian");
  printf("Введите координаты первой точки (x1;y1): "); // вводим первую точку
  scanf("%f %f",&x1,&y1); //считываем
  printf("\nВведите координаты второй точки (x2;y2): "); // вводим вторую точку
  scanf("%f %f",&x2,&y2); //считываем
  printf("\nВведите координаты третьей точки (x3;y3): "); // вводим третью точку
  scanf("%f %f",&x3,&y3); //считываем
  if ((x1==x2==x3)||(y1==y2==y3)||(x1==y1==x2==y2==x3==y3)) // проверяем условие работы теоремы, т.к. в теореме говорится о произвольном треугольнике
  printf ("\nТреугольник, образованный тремя введенными точками, не удовлетворяет формулировке теоремы");
  else
  {
  a=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); //находим длины отрезков, образующих треугольник
  b=sqrt(pow((x3-x2),2)+pow((y3-y2),2)); //находим длины отрезков, образующих треугольник
  c=sqrt(pow((x1-x3),2)+pow((y1-y3),2)); //находим длины отрезков, образующих треугольник
  s=0.5*abs(x1*(y2-y3)-y1*(x2-x3)+x2*y3-y2*x3); //находим площадь треугольника
  R=(a*b*c)/(4*s); //находим радиус описанной вокруг треугольника окружности
  r=R/2; // находим радиус окружности Фейербаха
  x0=m1(x1,y1,x2,y2,x3,y3,s); //формула для вычисления координаты центра описанной окружности по оси х
  y0=m2(x1,y1,x2,y2,x3,y3,s); //формула для вычисления координаты центра описанной окружности по оси у
  q=g1(x1,y1,x2,y2,x3,y3); //формула для вычисления удаления центра описанной окружности от центра окружности Фейербаха по оси х
  p=g2(q,x1,y1,x2,y2,x3,y3); //формула для вычисления координаты центра описанной окружности от центра окружности Фейербаха по оси у
  e=(x0+p)/2; //формула для вычисления координаты центра окружности Фейербаха по оси х
  f=(y0+q)/2; //формула для вычисления координаты центра окружности Фейербаха по оси у
  printf("\nЦентр окружности Фейербаха имеет координаты: (%f; %f), радиус окружности Фейербаха: %f",e,f,r);
 }
}
В чем требуется помощь: в оценке правильности работы программы и в подтверждении справедливости утверждения, для чего требуется показать расстояния от центра окружности до всех точек (9 точек, что следует из самой формулировки окружности) и показать их равенство радиусу окружности Фейербаха.

В целом, для доказательства утверждения нужно дополнительно находить все эти 9 точек и расстояние от них до центра окружности Фейербаха, что сильно усложнит код ввиду того, что как минимум из них это основания высот, три - середины отрезка, три - середины отрезков, что соединяют вершины с ортоцентром. Предполагаю, что будет достаточно показать и три или только шесть точек для наглядности, но опять же как это сделать я пока не придумал, а все попытки приводили к неравенству радиуса и длин этих отрезков (от точек до центра окр.).

Заранее благодарю и просто спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2021, 22:37
Ответы с готовыми решениями:

Окружность Фейербаха
Проверить справдливость утверждения, что середины сторон плоского треугольника, основания его высот и середины отрезков, соединяющих точку...

Окружность вписана в квадрат заданной площади; найти площадь квадрата, вписанного в эту окружность
Окружность вписана в квадрат заданной площади. Найти площадь квадрата, вписанного в эту окружность. Во сколько раз площадь вписанного...

Окружность Фейербаха. Найти радиус и определить координаты центра
Даны некоторые точки (x1, y1), (x2, y2), (x3, y3), которые являются координатами вершин треугольника. Как можно исходя из этих данных...

1
0 / 0 / 1
Регистрация: 21.11.2021
Сообщений: 3
07.01.2022, 18:05  [ТС]
Лучший ответ Сообщение было отмечено ildwine как решение

Решение

По итогу сам сделал, вышло как-то так:
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
 
float f1 (float x1, float y1, float x2, float y2, float x3, float y3)
{ 
float g1;
g1=-(((((y1+y2)/2)-((y2+y3)/2))*((((x1+x3)/2)*((x1+x3)/2))+(((y1+y3)/2)*((y1+y3)/2)))+(((y2+y3)/2)-((y1+y3)/2))*((((x1+x2)/2)*((x1+x2)/2))+(((y1+y2)/2)*((y1+y2)/2)))+(((y1+y3)/2)-((y1+y2)/2))*((((x2+x3)/2)*((x2+x3)/2))+(((y2+y3)/2)*((y2+y3)/2))))/(2*((((x1+x2)/2)-((x2+x3)/2))*(((y1+y3)/2)-((y1+y2)/2))-(((y1+y2)/2)-((y2+y3)/2))*(((x1+x3)/2)-((x1+x2)/2)))));
return g1;
}
float f2 (float x1, float y1, float x2, float y2, float x3, float y3)
{ 
float g2;
  g2=(((((x1+x2)/2)-((x2+x3)/2))*((((x1+x3)/2)*((x1+x3)/2))+(((y1+y3)/2)*((y1+y3)/2)))+(((x2+x3)/2)-((x1+x3)/2))*((((x1+x2)/2)*((x1+x2)/2))+(((y1+y2)/2)*((y1+y2)/2)))+(((x1+x3)/2)-((x1+x2)/2))*((((x2+x3)/2)*((x2+x3)/2))+(((y2+y3)/2)*((y2+y3)/2))))/(2*((((x1+x2)/2)-((x2+x3)/2))*(((y1+y3)/2)-((y1+y2)/2))-(((y1+y2)/2)-((y2+y3)/2))*(((x1+x3)/2)-((x1+x2)/2)))));
  return g2;
}
// ^^^ формулы для дальнейших вычислений центра окружности Фейербаха
 
void main()
{ 
  float x1,y1,x2,y2,x3,y3,a,b,c,s,R,r,x0,y0;
  setlocale(LC_ALL, "Russian");
  printf ("Теорема гласит: Окружность девяти точек ПРОИЗВОЛЬНОГО треугольника касается вписанной и всех трёх вневписанных окружностей этого треугольника.");
  printf ("\nТреугольник, у которого все стороны имеют разную длину и ни один из углов не равен 90 градусам, называется ПРОИЗВОЛЬНЫМ.");
  printf("\nВведите координаты первой точки (x1;y1): "); // вводим первую точку
  scanf("%f %f",&x1,&y1); //считываем
  printf("\nВведите координаты второй точки (x2;y2): "); // вводим вторую точку
  scanf("%f %f",&x2,&y2); //считываем
  printf("\nВведите координаты третьей точки (x3;y3): "); // вводим третью точку
  scanf("%f %f",&x3,&y3); //считываем
  s=0.5*abs(x1*(y2-y3)-y1*(x2-x3)+x2*y3-y2*x3); //находим площадь треугольника
  a=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); //находим длины отрезков, образующих треугольник
  b=sqrt(pow((x3-x2),2)+pow((y3-y2),2)); //находим длины отрезков, образующих треугольник
  c=sqrt(pow((x1-x3),2)+pow((y1-y3),2)); //находим длины отрезков, образующих треугольник
   if ((s==0) || (((a==b)&&(b==c)&&(a==c))) || (a==b)||(a==c)||(b==c))
    if ((a==b)&&(b==c)&&(a==c))
    {
    printf ("Данный треугольник является равносторонним, а согласно замечанию к теореме в равностороннем треугольнике окружность девяти точек не касается, а совпадает со вписанной окружностью.");
    r=(a/(2*sqrt(3)));
    y0=(a*y1+a*y2+a*y3)/(pow((a),3)); //Находим координаты центра вписанной окружности
    x0=(a*x1+a*x2+a*x3)/(pow((a),3));
    printf ("\nТогда радиус окружности Фейербаха равен %f, координаты его центра: (%f; %f).",r,x0,y0);
    }
    else
    printf ("Данный треугольник является равнобедренным, вычисления невозможны.");
   else
  {
  R=(a*b*c)/(4*s); //находим радиус описанной вокруг треугольника окружности
  r=R/2; //находим радиус окружности Фейербаха
  x0=f1(x1,y1,x2,y2,x3,y3); //формула для вычисления координаты центра описанной окружности по оси х
  y0=f2(x1,y1,x2,y2,x3,y3); //формула для вычисления координаты центра описанной окружности по оси у
  printf("\nЦентр окружности Фейербаха имеет координаты: (%f; %f), радиус окружности Фейербаха: %f",x0,y0,r);
 }
}
Расстояние от трех точек (а здесь решается через три точки) до центра окружности наглядно я не показывал, решил, что нет смысла. Программа работает вроде как корректно и без ошибок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2022, 18:05
Помогаю со студенческими работами здесь

Graph. Вписать в окружность квадрат, в него - окружность, далее - шестиугольник, окружность и треугольник.
вписать в окружность квадрат, в него- окружность, далее- шестиугольник, окружность, треугольник!!

помогите пожалуйста. 8. Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность красного цвета в центре экрана. Переместить окружность в п
Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность красного цвета в центре экрана. Переместить окружность в правый верхний...

Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность зеленого цвета в правом нижнем углу. Переместить окружность в центр экрана и
Используя Объектно-ориентированное программирование-ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность зеленого цвета в правом...

Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность зеленого цвета в правом нижнем углу. Переместить окружность в центр экрана и
Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность зеленого цвета в правом нижнем углу. Переместить окружность в центр...

Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность красного цвета в центре экрана. Переместить окружность в правый верхний угол эк
Используя ООП, определить объект ОКРУЖНОСТЬ. Отобразить окружность красного цвета в центре экрана. Переместить окружность в правый верхний...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru