Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2009, 14:14   #1
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
Сообщение Задача в BORLAND C++

Текст задачи такой - даны координаты в ершин треугольника, и даны координаты точки которая внутри этого треугольника находица, надо определить расстояние от это точки до ближайшей стороны этого треугольника
вот прога есть, но она после прогона тупо выдает принадлежит ли точка с заданными коорд треугольнику, вооот, а мне нужно чтобы расстояние до ближайшей прямой указывала еще,я смотрю текст проги там вроде написано все , но каким то образом этот блок пропускается, блок расчета расстояния до ближ прямой...
Ступор....помогите плз,обхясните в чем трабл

Код:
#include <iostream.h>
#include <math.h>
#include <conio.h>clrscr;
 typedef double D;  // double = D
  D Line(D,D,D,D); // функция
  D Geron (D,D,D,D,D,D); // функция
  D High (D,D); // функция нахождения наименьшего расстояния от точки до стороны треугольника
  int Prov1 (D,D,D); // функция проверки
  int Prov2 (D,D,D,D,D,D,D,D); // функция проверки
  
  void main()

  { D x1,y1,x2,y2,x3,y3,x4,y4,S1,S2,S3,H, P1, P2,ab,bc,ca ; // инициализация переменных
 
  cout<<"Vvedite koordinati vershin treygolnika:";
  cout<<"\nx1="; cin>>x1; //ввод координат вершин
  cout<<"y1="; cin>>y1; //ввод координат вершин
  cout<<"x2="; cin>>x2; //ввод координат вершин
  cout<<"y2="; cin>>y2; //ввод координат вершин
  cout<<"x3="; cin>>x3; //ввод координат вершин
  cout<<"y3="; cin>>y3; //ввод координат вершин
  cout<<"Vvedite koordinati to4ku:";
  cout<<"\nx4="; cin>>x4; //ввод координат вершин
  cout<<"y4="; cin>>y4; //ввод координат вершин
  
       ab=Line(x1,y1,x2,y2); //присвоение функции переменной
       bc=Line(x2,y2,x3,y3); //присвоение функции переменной
       ca=Line(x3,y3,x1,y1); //присвоение функции переменной

  P1=Prov1(ab,bc,ca); //присвоение функции переменной
  P2=Prov2(x1,y1,x2,y2,x3,y3,x4,y4); //присвоение функции переменной

  if (P1==0)  {cout<<"Vershini lezat na odnoi pryamoi, postroenie nevozmozno!";
		getch();}
  else  if (P2==0) {cout<<"To4ka lezit vnytri treygolnika!";
   getch();}
   else {
  S1=Geron(x1,y1,x2,y2,x4,y4); //присвоение функции переменной
  S2=Geron(x1,y1,x3,y3,x4,y4); //присвоение функции переменной
  S3=Geron(x2,y2,x3,y3,x4,y4); //присвоение функции переменной


  H=High(High(S1,S2),S3); //присвоение функции переменной

  cout<<"Naimenshee rasstoyanie ot to4ki do storoni treygolnika="<<H;
  getch();}
  }

//описание функций
  D Line(D a,D b,D c,D d)
  {return sqrt((c-a)*(c-a)+(d-b)*(d-b)); // sqrt - корень
  }

// функция проверки
  int Prov1(D ab, D bc,D ca)
    {return ab+bc>ca ;
    }

// функция проверки
  int Prov2 (D a1, D a2,D b1, D b2, D c1, D c2, D o1,D o2 )
   {  D ab, bc, ca, ao, bo, co;
       ao=Line(a1,a2,o1,o2);
       bo=Line(b1,b2,o1,o2);
       co=Line(c1,c1,o1,o2);
       return  (ao<ab) && (bo<bc) && (co<ca);
   }

  D Geron(D a1, D a2,D b1, D b2, D c1, D c2)
  {D p, ab, bc ,ca;
  p=(ab+bc+ca)/2;
  return sqrt(p*(p-ab)*(p-bc)*(p-ca))*2/ab;
  }

// функция нахождения наименьшего расстояния от точки до стороны треугольника
  D High (D h1, D h2)
  { if (h1<h2)return h1; else return h2;
  }
Agent[PNZ] вне форума Ответить с цитированием
Старый 22.03.2009, 22:11   #2
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Код:
if (P1==0)  
{
 cout<<"Vershini lezat na odnoi pryamoi, postroenie nevozmozno!";
 getch();
}
else
  if (P2==0)
  {
    cout<<"To4ka lezit vnytri treygolnika!";

    S1=Geron(x1,y1,x2,y2,x4,y4); //присвоение функции переменной
    S2=Geron(x1,y1,x3,y3,x4,y4); //присвоение функции переменной
    S3=Geron(x2,y2,x3,y3,x4,y4); //присвоение функции переменной

    H=High(High(S1,S2),S3); //присвоение функции переменной
    cout<<"Naimenshee rasstoyanie ot to4ki do storoni treygolnika="<<H;
    getch();
  }
Svetlag вне форума Ответить с цитированием
Старый 22.03.2009, 22:31   #3
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

в этой части ошибка штоль?прокомментирй плиз, а то не сообразил я чета....
Agent[PNZ] вне форума Ответить с цитированием
Старый 22.03.2009, 22:53   #4
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Да, ошибка здесь. В представленном коде расстояние будет вычисляться только в случае, если точка не лежит внутри трегольника.

Если нужно определить расстояние от точки до стороны треугольника в случае, когда точка лежит внутри треугольника, то так как выше написано: определяем, что точка внутри треугольника, и вычисляем здесь же расстояние.

Если нужно определить расстояние от точки до стороны треугольника независимо от того, где лежит точка, то 1. выясняем, можно ли построить треугольник; 2. а)определяем, лежит ли точка внутри треугольника и выводим об этом сообщение; б) вычисляем расстояние. Обращайте внимание на то, где заканчивается выполнение операторов if else.
Код:
if (P1==0)  
{
 cout<<"Vershini lezat na odnoi pryamoi, postroenie nevozmozno!";
 getch();
}
else
{
  if (P2==0)
    cout<<"To4ka lezit vnytri treygolnika!";		
  
  S1=Geron(x1,y1,x2,y2,x4,y4); //присвоение функции переменной
  S2=Geron(x1,y1,x3,y3,x4,y4); //присвоение функции переменной
  S3=Geron(x2,y2,x3,y3,x4,y4); //присвоение функции переменной

  H=High(High(S1,S2),S3); //присвоение функции переменной
  cout<<"Naimenshee rasstoyanie ot to4ki do storoni treygolnika="<<H;
  getch();}
}
Svetlag вне форума Ответить с цитированием
Старый 22.03.2009, 23:01   #5
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Всё гораздо проще, заранее известны координаты вершин треугольника и координаты точки, которая заранее известно лежит ВНУТРИ этого треугольника, никаких лишних действий не нужно и усложнять тож ни к чему. Просто вычисляем расстояние от этой точки до ближайшей стороны треугольника...Если не трудно вырежи все не нужное из моего кода, чтобы осталась лишь суть.Заранее спасиб)А если и с комментариями, то моей благодарности просто и предела то не будет)))
Agent[PNZ] вне форума Ответить с цитированием
Старый 22.03.2009, 23:05   #6
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Бляха муха, я проверил тока што где т ошибка оказываеца она и считает неправильно, че не вводи грит что точка внутри треугольника лежит. ну че за бред!!!
Agent[PNZ] вне форума Ответить с цитированием
Старый 23.03.2009, 09:59   #7
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Agent[PNZ] Посмотреть сообщение
Всё гораздо проще, заранее известны координаты вершин треугольника и координаты точки, которая заранее известно лежит ВНУТРИ этого треугольника, никаких лишних действий не нужно и усложнять тож ни к чему. Просто вычисляем расстояние от этой точки до ближайшей стороны треугольника...
Код:
#include <iostream.h>
#include <math.h>
typedef double D;  

//определение длины стороны треугольника
D Line(D a,D b,D c,D d)
{
	return sqrt((c-a)*(c-a)+(d-b)*(d-b)); // sqrt - корень
}

//расчет расстояния от точки до стороны треугольника
//т.е. высоты треугольника с вершиной в заданной точке
D Geron(D a1, D a2,D b1, D b2, D o1, D o2)
{
  D ab = Line(a1, a2, b1, b2);
  D bo = Line(b1, b2, o1, o2);
  D oa = Line(o1, o2, a1, a2);
  D p=(ab+bo+oa)/2;
  return sqrt(p*(p-ab)*(p-bo)*(p-oa))*2/ab;
}
// функция нахождения наименьшего значения
D High (D h1, D h2)
{ 
  if (h1<h2) return h1;
  else return h2;
}


int main()
{
  D x1,y1,x2,y2,x3,y3,x4,y4,S1,S2,S3,H ; // инициализация переменных
 
  cout<<"Vvedite koordinati vershin treygolnika:";
  cout<<"\nx1="; cin>>x1; //ввод координат вершин
  cout<<"y1="; cin>>y1; //ввод координат вершин
  cout<<"x2="; cin>>x2; //ввод координат вершин
  cout<<"y2="; cin>>y2; //ввод координат вершин
  cout<<"x3="; cin>>x3; //ввод координат вершин
  cout<<"y3="; cin>>y3; //ввод координат вершин
  cout<<"Vvedite koordinati to4ku:";
  cout<<"\nx4="; cin>>x4; //ввод координат вершин
  cout<<"y4="; cin>>y4; //ввод координат вершин
  
  S1=Geron(x1,y1,x2,y2,x4,y4); //определение расстояния от точки до каждой из сторон
  S2=Geron(x1,y1,x3,y3,x4,y4); 
  S3=Geron(x2,y2,x3,y3,x4,y4); 

  H=High(High(S1,S2),S3); //определение наименьшего расстояния
  cout<<"Naimenshee rasstoyanie ot to4ki do storoni treygolnika="<<H<<endl;
  
  return 0;
}

Последний раз редактировалось Svetlag; 23.03.2009 в 16:32.
Svetlag вне форума Ответить с цитированием
Старый 23.03.2009, 10:07   #8
XuTpbIu
Злобстер
Форумчанин
 
Аватар для XuTpbIu
 
Регистрация: 19.03.2009
Сообщений: 134
По умолчанию

Блин. Ну как будто математику никто не изучал. Открываем справочник и смотрим мат. формулу для вычисления расстояния от точки до прямой и как получить уравнение прямой по 2 точкам. Вычисляем 3 таких расстояния(от точки до сторон треугольника) и находим наименьшее. Так условие предусматривает, что данные вводятся так, что у нас ТОЧНО дан треугольник и ТОЧНО дана точка лежащая внутри него, то проверки считаю бессмыслеными.
От знаний ещё никто не умирал, но рисковать не стоит.
XuTpbIu вне форума Ответить с цитированием
Старый 23.03.2009, 16:03   #9
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от XuTpbIu Посмотреть сообщение
Блин. Ну как будто математику никто не изучал. Открываем справочник и смотрим мат. формулу для вычисления расстояния от точки до прямой и как получить уравнение прямой по 2 точкам. Вычисляем 3 таких расстояния(от точки до сторон треугольника) и находим наименьшее. Так условие предусматривает, что данные вводятся так, что у нас ТОЧНО дан треугольник и ТОЧНО дана точка лежащая внутри него, то проверки считаю бессмыслеными.
Не все так просто как думаешь)))Я прекрасно знаю формулы нахождения расстояния от точки до прямой, и как по двум точкам уравнение прямой вывести тоже знаю, но, есть вопрос, мож ты ответишь:
Пример:
Получаем уравнение прямой - 2х+5у+6=0
Для того чтобы найти расстояние от точки до прямой, выраженной уравнением написанным выше, необходимо использовать коэффициенты из этого уравнения - A-2, B-5 и C-6, как их выразить-то из этого уравнения?
Agent[PNZ] вне форума Ответить с цитированием
Старый 23.03.2009, 16:53   #10
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Зачем все усложнять с уравнениями прямых, если можно построить треугольник с двумя вершинами заданного треугольника, а третья вершина будет данная точка O. И найти высоту, проведенную из точки O на сторону треугольника. Формула известна из геометрии. Это и будет расстояние от точки до стороны заданного треугольника.
Svetlag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простая задача на тему Структуры Borland C++ Dower Помощь студентам 4 10.03.2009 10:04
Простенькая задача на BORLAND C++ для 1 курса, нужна консультация! Graf Xandr Помощь студентам 5 04.12.2008 20:07
Задача на массив [Borland C++] conqueror Помощь студентам 14 02.06.2008 14:10
задача под windows,помогите написать.Надо написать на Borland C++Builder 6. eddddii Помощь студентам 9 23.05.2008 17:04