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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2014, 15:27   #1
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию Расстояние от прямой до треугольника.

Hапишите пожалуйста какие нужно использовать формулы для нахождения правильного результата, не могу понять как решить это задание. Заранее спасибо!

Описание задания:
Найти расстояние между прямой, проходящей через две точки K(x_k, y_k) и М(x_m, y_m), и треугольником на плоскости, заданным координатами своих вершин A(x_a, y_a), B(x_b, y_b), С(x_с, y_с).
Формат входных данных: [x_k] [y_k] [x_m] [y_m] [x_a] [y_a] [x_b] [y_b] [x_с] [y_с]. Координаты задаются целыми числами в диапазоне ±1000.
Пример: 0 0 1 5 3 8 4 3 4 5
Формат выходных данных: [расстояние]. Расстояние представляется вещественным число с точностью до двух знаков.
Пример: 1.23


Самое простое смог сделать, формулу не знаю какую надо применить
Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int x_k; int y_k; int x_m; int y_m; 
	int x_a; int y_a; int x_b; int y_b;  int x_c; int y_c; 
	double Rasstoianie;

	printf("Vvod koordinat otrezka [KM]\n");
    printf("Vvod koordinat tochki K\n");
    scanf("%d", &x_k);
	scanf("%d", &y_k);

	printf("Vvod koordinat tochki M\n");
    scanf("%d", &x_m);
	scanf("%d", &y_m);

    printf("Vvod koordinat treugolinika ABC\n");
    printf("Vvod koordinat tochki A\n");
    scanf("%d", &x_a);
	scanf("%d", &y_a);

    printf("Vvod koordinat tochki B\n");
    scanf("%d", &x_b);
	scanf("%d", &y_b);

    printf("Vvod koordinat tochki C\n");
    scanf("%d", &x_c);
	scanf("%d", &y_c);
 
    Rasstoianie= ???


	_getch();

}

Последний раз редактировалось Stilet; 13.03.2014 в 20:40.
yura1234 вне форума Ответить с цитированием
Старый 13.03.2014, 18:34   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

1. Вам нужно вывести формулу прямой по двум точкам.
2. Потом рассчитать расстояния от линии до каждой точки треугольника.
(лениво формулы писать) Минимальное значение и будет искомым расстоянием.
3. учесть случай, когда прямая пересекает треугольник. А это случается, когда точки треугольника с отличным от нуля расстоянием до линии лежат по разные стороны от нее: (соответствующая теория)

Последний раз редактировалось Smogg; 13.03.2014 в 18:37.
Smogg вне форума Ответить с цитированием
Старый 13.03.2014, 20:03   #3
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

В чём я ошибся?(пишу код постепенно)
Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{       
        int a; int b; int c; double d;
	int x_k; int y_k; int x_m; int y_m; 
	int x_a; int y_a; int x_b; int y_b;  int x_c; int y_c; 
	double Rasstoianie;

	printf("Vvod koordinat otrezka [KM]\n");
    printf("Vvod koordinat tochki K\n");
    scanf("%d", &x_k);
	scanf("%d", &y_k);

	printf("Vvod koordinat tochki M\n");
    scanf("%d", &x_m);
	scanf("%d", &y_m);

    printf("Vvod koordinat treugolinika ABC\n");
    printf("Vvod koordinat tochki A\n");
    scanf("%d", &x_a);
	scanf("%d", &y_a);

    /*printf("Vvod koordinat tochki B\n");
    scanf("%d", &x_b);
	scanf("%d", &y_b);

    printf("Vvod koordinat tochki C\n");
    scanf("%d", &x_c);
	scanf("%d", &y_c);*/


	//Уравнение прямой ax + by + c = 0 из двух точек (x1, y1) и (x2, y2)
    a = y_m - y_k;
    b = x_k - x_m;
    c = (-a * x_k) - (b * y_k);
 
    //Расстояние от точки до прямой на плоскости.
	d = abs((a*x_a + b*y_a +c)/sqrt(a^2+b^2));
Компилятор пишет ошибку
Цитата:
1>------ Построение начато: проект: Lab3, Конфигурация: Debug Win32 ------
1>Компиляция...
1>stdafx.cpp
1>Компиляция...
1>Lab3.cpp
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(14 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(15 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(18 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(19 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(23 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(24 ) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306): см. объявление 'scanf'
1>c:\users\юра\documents\visual studio 2008\projects\lab3\lab3\lab3.cpp(41 ) : error C2668: sqrt: неоднозначный вызов перегруженной функции
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(581): может быть 'long double sqrt(long double)'
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(533): или 'float sqrt(float)'
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(128): или 'double sqrt(double)'
1> при попытке сопоставить список аргументов '(int)'
1>Журнал построения был сохранен в "file://c:\Users\Юра\Documents\Visual Studio 2008\Projects\Lab3\Lab3\Debug\Build Log.htm"
1>Lab3 - ошибок 1, предупреждений 6
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Последний раз редактировалось Stilet; 13.03.2014 в 20:40.
yura1234 вне форума Ответить с цитированием
Старый 13.03.2014, 20:36   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

sqrt((float)(a^2+b^2)) - тип аргумента, передаваемого в scanf, нужно привести к float/double.
Или можете сразу объявить a, b, с как double. Тогда и результат a^2+b^2 тоже будет double.
Smogg вне форума Ответить с цитированием
Старый 13.03.2014, 21:03   #5
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

Цитата:
d1 = abs((a*x_a + b*y_a +c)/sqrt((float)(a^2+b^2)));
d2 = abs((a*x_b + b*y_b +c)/sqrt((float)(a^2+b^2)));
d3 = abs((a*x_c + b*y_c +c)/sqrt((float)(a^2+b^2)));
При данных входных данных: 0 0 1 5 3 8 4 3 4 5
получились d1=2.85
d2=6.94
d4=6.12
вместо 1.23
где я ошибся?
yura1234 вне форума Ответить с цитированием
Старый 13.03.2014, 21:48   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

a^2 - не возведение в квадрат. ^ - это оператор исключаюещего ИЛИ

Последний раз редактировалось Smogg; 13.03.2014 в 22:02.
Smogg вне форума Ответить с цитированием
Старый 13.03.2014, 23:33   #7
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

Цитата:
d1 = abs((a*x_a + b*y_a +c)/sqrt((float)(a*a+b*b)));
сделал квадрат, получил 1.37,
1.23 так близко....
yura1234 вне форума Ответить с цитированием
Старый 14.03.2014, 11:55   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Код:
	float a, b, c, d;
	float x_k = 0, y_k = 0, x_m = 1, y_m = 5; 
	float x_a = 3,  y_a=8,  x_b=4,  y_b= 3, x_c =4,  y_c=5; 
	
	float arrPnt[6]={3,8,4,3,4,5};

//Уравнение прямой ax + by + c = 0 из двух точек (x1, y1) и (x2, y2)
    a = y_m - y_k;
    b = x_k - x_m;
    c = (-a * x_k) - (b * y_k);
 
	d= a*x_m + b*y_m+c;
	d= a*x_k + b*y_k+c;
    //Расстояние от точки до прямой на плоскости.
	d = abs((a*x_a + b*y_a +c)/sqrt((float)(a*a+b*b))); //1,3728130
	d = abs((a*x_b + b*y_b +c)/sqrt((float)(a*a+b*b))); //3,3339744
	d = abs((a*x_c + b*y_c +c)/sqrt((float)(a*a+b*b))); // 2,9417419
	
	// расчет через высоты
	float MK, MP, KP, phlf;
	for (int i = 0; i < 3 ; i++)
	{
		MK = sqrt(pow(x_m - x_k, 2) + pow(y_m - y_k,2));
		MP = sqrt(pow(x_m - arrPnt[i*2],2)+ pow(y_m - arrPnt[i*2+1],2));
		KP = sqrt(pow(x_k - arrPnt[i*2],2)+ pow(y_k - arrPnt[i*2+1],2));
		phlf=(MK+MP+KP)/2;
		d= 2*sqrt(phlf*(phlf-MK)*(phlf-MP)*(phlf-KP))/MK; // d1 = 1,3728096; d2 = 3,3339744; d3 = 2,9417419
	}
Как видишь, через высоты получилось то же самое. Ну, почти то же самое, расхождение спишем на погрешность float'a)
Smogg вне форума Ответить с цитированием
Старый 15.03.2014, 12:25   #9
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{   
	//Объявление переменных
	int x_k; int y_k; int x_m; int y_m; 
	int x_a; int y_a; int x_b; int y_b;  int x_c; int y_c;
	int a; int b; int c;
	double d1; double d2; double d3;

    //Ввод координат точек отрезка
	printf("Vvod koordinat otrezka [KM]\n");
    printf("Vvod koordinat tochki K\n");
    scanf("%d", &x_k);
	scanf("%d", &y_k);

	printf("Vvod koordinat tochki M\n");
    scanf("%d", &x_m);
	scanf("%d", &y_m);

	//Ввод координат точек треугольника
    printf("Vvod koordinat treugolinika ABC\n");
    printf("Vvod koordinat tochki A\n");
    scanf("%d", &x_a);
	scanf("%d", &y_a);

    printf("Vvod koordinat tochki B\n");
    scanf("%d", &x_b);
	scanf("%d", &y_b);

    printf("Vvod koordinat tochki C\n");
    scanf("%d", &x_c);
	scanf("%d", &y_c);


	//Уравнение прямой ax + by + c = 0 из двух точек (x1, y1) и (x2, y2)
    a = y_m - y_k;
    b = x_k - x_m;
    c = (-a * x_k) - (b * y_k);
 
    //Расстояние от точки до прямой на плоскости.
	d1 = abs((a*x_a + b*y_a +c)/sqrt((float)(a*a+b*b)));
    d2 = abs((a*x_b + b*y_b +c)/sqrt((float)(a*a+b*b)));
    d3 = abs((a*x_c + b*y_c +c)/sqrt((float)(a*a+b*b)));

	//Вывод расстояние между прямой и треугольником
    if(d1<d2 && d1<d3)
	    printf("Rasstoianie %f",d1);
	
	if(d2<d3 && d2<d1)
        printf("Rasstoianie %f",d2);
	
	if(d3<d1 && d3<d2)
	    printf("Rasstoianie %f",d3);
 
	_getch();

}
Теперь думаю задание выполнено.
yura1234 вне форума Ответить с цитированием
Старый 15.03.2014, 21:06   #10
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
Теперь думаю задание выполнено.
См. сообщение №2, пункт 3
Smogg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны три сторони треугольника a,b,c, написать программу для вычисления трёх высот данного треугольника giganto97 Паскаль, Turbo Pascal, PascalABC.NET 4 13.10.2013 11:00
Даны декартовы координаты вершин треугольника (в плоскости). Разработать проект, вычисляющий площадь и периметр этого треугольника Яночка190 Общие вопросы Delphi 1 12.01.2013 12:49
найти расстояние от произвольной точки до ближайшей стороны треугольника. Неправильно находит расстояние zaira001002 Помощь студентам 4 05.11.2012 20:55
как найти расстояние между отрезком и прямой? student_92 Общие вопросы C/C++ 16 20.03.2012 21:50
кратчайшее расстояние от заданной точки до ближайщей стороны треугольника ddeman666 Помощь студентам 1 03.05.2010 14:47