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

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

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

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

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

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

Код:
int x_k, y_k, x_m, y_m, x_a, y_a, x_b, y_b, x_c, y_c;
	int a, b, c;
	double d1, d2, d3;

    scanf("%d%d%d%d%d%d%d%d%d%d", &x_k, &y_k, &x_m, &y_m, &x_a, &y_a, &x_b, &y_b, &x_c, &y_c);
	 
if (-1000 > x_k||x_k > 1000 ||-1000 > y_k|| y_k > 1000
	||-1000 > x_m||x_m > 1000 ||-1000 > y_m|| y_m > 1000
	||-1000 > x_a||x_a > 1000 ||-1000 > y_a|| y_a > 1000
	||-1000 > x_b||x_b > 1000 ||-1000 > y_b|| y_b > 1000
	||-1000 > x_c||x_c > 1000 ||-1000 > y_c|| y_c > 1000) 
		{
		printf("INVALID INPUTS!!!");
		_getch();
	    return 0; 
		}
Сделал проверку на +-1000,
теперь думаю проще всего будет сделать два уравнения для нахождения точки пересечения(A1*x+B1*y+C1=0 и A2*x+B2*y+C2=0), если она есть то вывести что отрезки пересекаются, если нет решать дальше. Вот только сделать это для всех отрезков треугольника или только для одного?
yura1234 вне форума Ответить с цитированием
Старый 17.03.2014, 23:20   #22
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
Код:
int x_k, y_k, x_m, y_m, x_a, y_a, x_b, y_b, x_c, y_c;
	int a, b, c;
	double d1, d2, d3;

    scanf("%d%d%d%d%d%d%d%d%d%d", &x_k, &y_k, &x_m, &y_m, &x_a, &y_a, &x_b, &y_b, &x_c, &y_c);
	 
if (-1000 > x_k||x_k > 1000 ||-1000 > y_k|| y_k > 1000
	||-1000 > x_m||x_m > 1000 ||-1000 > y_m|| y_m > 1000
	||-1000 > x_a||x_a > 1000 ||-1000 > y_a|| y_a > 1000
	||-1000 > x_b||x_b > 1000 ||-1000 > y_b|| y_b > 1000
	||-1000 > x_c||x_c > 1000 ||-1000 > y_c|| y_c > 1000) 
		{
		printf("INVALID INPUTS!!!");
		_getch();
	    return 0; 
		}
Сделал проверку на +-1000,
теперь думаю проще всего будет сделать два уравнения для нахождения точки пересечения(A1*x+B1*y+C1=0 и A2*x+B2*y+C2=0), если она есть то вывести что отрезки пересекаются, если нет решать дальше.
Для пользователя это довольно кривой вариант проверки ввода. Как минимум, не рассказано, почему инпут вдруг стал инвалид.
Цитата:
Вот только сделать это для всех отрезков треугольника или только для одного?
Я твердо уверен, что если линия пересекает треугольник и не совпадает с какой-нить стороной, то она пересекает ровно две стороны. А почему - не докажу ни за что)
Т.е. одной проверки - мало, а три -много.
Smogg вне форума Ответить с цитированием
Старый 18.03.2014, 18:21   #23
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

http://www.kakprosto.ru/kak-128141-k...heniya-pryamyh
по это ссылке взял формулы из второго и третьего пункта
Код:
//Уравнение прямой 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);
    
	//отрезок CB
    d = y_c - y_b;
	e = x_b - x_c;
	f = (-d * x_b) - (e * y_b);
    
	//точки пересечения
	x = (f*b-c*e)/(a*e-d*b);
	y = (c*d-f*a)/(a*e-d*b);
не работает((, можете написать формулы для нахождения по векторным произведениям?

Последний раз редактировалось yura1234; 18.03.2014 в 19:14.
yura1234 вне форума Ответить с цитированием
Старый 19.03.2014, 19:06   #24
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

1.Треугольник вырождается в прямую

2.Прямая и сторона треугольника совпадают
3.точки прямой совпадают

На этих входных данных программа не работает, что нужно сделать что бы это исправить?
Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>


int _tmain(int argc, _TCHAR* argv[])
{   

	//Объявление переменных
	int x_k, y_k, x_m, y_m, x_a, y_a, x_b, y_b, x_c, y_c;
	int a, b, c, h, e, f, d;
	double d1, d2, d3, x, y;

    //Ввод переменных
	scanf("%d%d%d%d%d%d%d%d%d%d", &x_k, &y_k, &x_m, &y_m, &x_a, &y_a, &x_b, &y_b, &x_c, &y_c);
	
	// проверка переменных не превышают ли они диапазон ±1000 
  if (-1000 > x_k||x_k > 1000 ||-1000 > y_k|| y_k > 1000
	||-1000 > x_m||x_m > 1000 ||-1000 > y_m|| y_m > 1000
	||-1000 > x_a||x_a > 1000 ||-1000 > y_a|| y_a > 1000
	||-1000 > x_b||x_b > 1000 ||-1000 > y_b|| y_b > 1000
	||-1000 > x_c||x_c > 1000 ||-1000 > y_c|| y_c > 1000) 

		{
        //вывод сообщения о неверно введённых данных 
 		printf("No solution");
		_getch();
		return 0;
	    }
	       
	//Уравнение прямой 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("%.2f",d1);
	
	if(d2<d3 && d2<d1)
        printf("%.2f",d2);
	
	if(d3<d1 && d3<d2)
	    printf("%.2f",d3);
 
	_getch();

}
Изображения
Тип файла: jpg DSC_0056.jpg (117.3 Кб, 122 просмотров)
Тип файла: jpg DSC_0057.jpg (99.8 Кб, 121 просмотров)
yura1234 вне форума Ответить с цитированием
Старый 19.03.2014, 21:09   #25
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
http://www.kakprosto.ru/kak-128141-k...heniya-pryamyh
по это ссылке взял формулы из второго и третьего пункта
Код:
//Уравнение прямой 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);
    
	//отрезок CB
    d = y_c - y_b;
	e = x_b - x_c;
	f = (-d * x_b) - (e * y_b);
    
	//точки пересечения
	x = (f*b-c*e)/(a*e-d*b);
	y = (c*d-f*a)/(a*e-d*b);
не работает((, можете написать формулы для нахождения по векторным произведениям?
Я бы лично находил у, подставляя найденный х в исходную формулу ax + by + c = 0 :
y = -(c + ax)/b
Так проще дебажить, ибо нагляднее)
Smogg вне форума Ответить с цитированием
Старый 19.03.2014, 21:32   #26
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
1.Треугольник вырождается в прямую
Ну и пусть вырождается. Нам до его площади дела нету. Интересны лишь точки его углов. Лишь бы прямую не пересекал.

Цитата:
2.Прямая и сторона треугольника совпадают
Не знаю, что там тестеру не нравится. У меня нормально показывает ноль.
Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <algorithm>


int _tmain(int argc, _TCHAR* argv[])
{   
	float _Eps = 1.0e-20;
	//Объявление переменных
	int x_k, y_k, x_m, y_m, x_a, y_a, x_b, y_b, x_c, y_c;
	int a, b, c, h, e, f, d;
	double d1, d2, d3, x, y;

	//Ввод переменных
	//scanf("%d%d%d%d%d%d%d%d%d%d", &x_k, &y_k, &x_m, &y_m, &x_a, &y_a, &x_b, &y_b, &x_c, &y_c);
// 	 x_k = 3;
// 	 y_k = 15;
// 	 x_m = 10;
// 	 y_m = 12;
// 	 x_a = 0;
// 	 y_a = 0;
// 	 x_b = 2;
// 	 y_b = 2;
// 	 x_c = 5;
// 	 y_c = 5;

	x_k = 80;
	y_k = 80;
	x_m = 95;
	y_m = 66;
	x_a = 72;
	y_a = 23;
	x_b = 95;
	y_b = 66;
	x_c = 80;
	y_c = 80;
	// проверка переменных не превышают ли они диапазон ±1000 
	if (-1000 > x_k||x_k > 1000 ||-1000 > y_k|| y_k > 1000
		||-1000 > x_m||x_m > 1000 ||-1000 > y_m|| y_m > 1000
		||-1000 > x_a||x_a > 1000 ||-1000 > y_a|| y_a > 1000
		||-1000 > x_b||x_b > 1000 ||-1000 > y_b|| y_b > 1000
		||-1000 > x_c||x_c > 1000 ||-1000 > y_c|| y_c > 1000) 

	{
		//вывод сообщения о неверно введённых данных 
		printf("No solution");
		_getch();
		return 0;
	}

	//Уравнение прямой 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 < _Eps) d1 = 0.0;
	if (d2 < _Eps) d2 = 0.0;
	if (d3 < _Eps) d3 = 0.0;
	
	//Вывод расстояние между прямой и треугольником
	
	printf("%.2f", std::min(abs(d1), std::min (abs(d2), abs(d3))));

/*	if(d2<d3 && d2<d1)
		printf("%.2f",d2);

	if(d3<d1 && d3<d2)
		printf("%.2f",d3);*/

	_getch();

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

Объясните пожалуйста, что значат некоторые строки кода
Код:
if (d1 < _Eps) d1 = 0.0;
	if (d2 < _Eps) d2 = 0.0;
	if (d3 < _Eps) d3 = 0.0;
и
Код:
 std::min(abs(d1), std::min (abs(d2), abs(d3)))
yura1234 вне форума Ответить с цитированием
Старый 19.03.2014, 23:46   #28
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
Объясните пожалуйста, что значат некоторые строки кода
Код:
if (d1 < _Eps) d1 = 0.0;
	if (d2 < _Eps) d2 = 0.0;
	if (d3 < _Eps) d3 = 0.0;
и
Код:
 std::min(abs(d1), std::min (abs(d2), abs(d3)))
1е - это потому что float имеет погрешность. И после вычислений два числа считаются равными, если они не различаются на некую заранее заданную минимальную константу.
// я как то пытался проникнуться операциями с плавающей точкой, но не очень с успехом. Поэтому удовлетворяюсь таким простеньким объяснением.

2е - это вычисление минимального числа из трех. С принудительным приведением к положительности. Впрочем, здесь модуль наверно и ни к чему.
Smogg вне форума Ответить с цитированием
Старый 20.03.2014, 19:19   #29
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

После подключения "testing.h", компилятор стал выдавать ошибку
Цитата:
1>------ Построение начато: проект: тесты, Конфигурация: Debug Win32 ------
1>Компиляция...
1>тесты.cpp
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\testing.h (64) : warning C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_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\stdlib.h(447): см. объявление 'getenv'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\testing.h (74) : warning C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_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\stdlib.h(447): см. объявление 'getenv'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\testing.h (298) : warning C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_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\stdlib.h(447): см. объявление 'getenv'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\testing.h (301) : warning C4244: инициализация: преобразование 'double' в 'float', возможна потеря данных
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\тесты.cpp (10) : warning C4305: инициализация: усечение из 'double' к 'float'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\тесты.cpp (16) : 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\тесты\тесты\тесты.cpp (25) : 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\тесты\тесты\тесты.cpp (45) : error C2589: (: недопустимая лексема справа от '::'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\тесты.cpp (45) : error C2059: синтаксическая ошибка: ::
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\тесты.cpp (45) : error C2589: (: недопустимая лексема справа от '::'
1>c:\users\юра\documents\visual studio 2008\projects\тесты\тесты\тесты.cpp (45) : error C2589: (: недопустимая лексема справа от '::'
1>Журнал построения был сохранен в "file://c:\Users\Юра\Documents\Visual Studio 2008\Projects\тесты\тесты\Debug\Bui ldLog.htm"
1>тесты - ошибок 4, предупреждений 7
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
yura1234 вне форума Ответить с цитированием
Старый 21.03.2014, 00:11   #30
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

иногда, порядок подключения хедеров важен.
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