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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 15:38   #1
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию Точка пересечения отрезков

Даны координаты начала и конца двух отрезков. Нужно кзнать точку пересечения естих отрезков. Pascal. Спасибо.
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 07.03.2009, 16:03   #2
PAWLO1993
Пользователь
 
Регистрация: 24.03.2008
Сообщений: 31
По умолчанию

Можно перейти к уравнениям прямых и найти точку пересечения прямых, что сделать очень просто и если точка пересечения будет принадлежать двум отрезкам, то это будет искомая точка, а если нет, то отрезки не пересекаются.
Уравнение прямой на плоскости, проходящей через две заданные точки (x1,y1) и (x2,y2) можно найти так:
a=y1-y2
b=x2-x1
c=-(a*x1+b*y1)
Для нахождения точки пересечения двух прямых нужно розвязати простую систему уравнений: A1x+B1y+C1=0 и A2x+B2y+C2=0
PAWLO1993 вне форума Ответить с цитированием
Старый 26.06.2010, 18:07   #3
nestr
Новичок
Джуниор
 
Регистрация: 26.06.2010
Сообщений: 1
Радость

Все очень просто!
х1, у1 и х2,у2 - координаты вершин первого отрезка;
х3, у3 и х4,у4 - координаты вершин второго отрезка;

для нахождения пересечения составляем уравнения прямых:
первое уравнение:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
второе уравнение
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
эти уравнения определяют прямую проходящую через две точки, то, что нам и надо.
Из этих уравнений находим х и у по следующим формулам:
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
так как наши прямые пересекаются, то у них есть общая точка пересечения с координатами (х,у), которую нам и надо найти.
для того, чтоб пересечение принадлежало нашим отрезкам, нужно его ограничить, т. е проверить условие:
если
(((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<=y) and(y4>=y)))
то существует точка пересечения данных отрезков, а нет – то нет и точки пересечения.
Еще следует проверить параллельность этих отрезков при помощи угловых коэффициентов:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
где k1 и k2 – тангенсы угла наклона отрезков к положительному направлению оси ОХ, если k1=k2, то отрезки параллельны, а значит, не имеют точек пересечения.

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

если остались вопросы или нужны исходники программ, пишите на мыло alexander.nestr@mail.ru или в icq 558213677.
nestr вне форума Ответить с цитированием
Старый 27.05.2011, 00:24   #4
juliaaaa
 
Регистрация: 27.11.2010
Сообщений: 7
По умолчанию

.....очень интересно,
juliaaaa вне форума Ответить с цитированием
Старый 10.08.2011, 23:44   #5
serpoverst
Новичок
Джуниор
 
Регистрация: 10.08.2011
Сообщений: 1
По умолчанию Готовая реализация на с++

Готовая функция.
Код:
POINT Point_X(POINT a1,POINT a2,POINT a3,POINT a4){
	POINT T;
	if(((a1.x<=T.x)&&(a2.x>=T.x)&&(a3.x<=T.x)&&(a4.x >=T.x))||((a1.y<=T.y)&&(a2.y>=T.y)&&(a3.y<=T.y)&&(a4.y>=T.y))){
		float x1=a1.x,x2=a2.x,x3=a3.x,x4=a4.x,y1=a1.y,y2=a2.y,y3=a3.y,y4=a4.y;
		float k1,k2;
		if(y2-y1!=0){
			k1=(x2-x1)/(y2-y1);
			if(y4-y3!=0){
				k2=(x4-x3)/(y4-y3);
				if(k1!=k2){
					T.x=((a1.x*a2.y-a2.x*a1.y)*(a4.x-a3.x)-(a3.x*a4.y-a4.x*a3.y)*(a2.x-a1.x))/((a1.y-a2.y)*(a4.x-a3.x)-(a3.y-a4.y)*(a2.x-a1.x));
					T.y=((a3.y-a4.y)*T.x-(a3.x*a4.y-a4.x*a3.y))/(a4.x-a3.x);
					T.x*=-1;
					return T;
				}else{
					T.x=969; T.y=969;
					//text2("Паралельны");
				}
			}else{
				T.x=969; T.y=969;
				//text2("Паралельны");
			}
		}else{
			T.x=969; T.y=969;
			//text2("Паралельны");
		}
	}else{
		//text2("Пересечение вне отрезка");
		T.x=979; T.y=979;
		return T;
	}

}
serpoverst вне форума Ответить с цитированием
Старый 25.12.2011, 13:15   #6
Painy
Новичок
Джуниор
 
Регистрация: 25.12.2011
Сообщений: 1
Вопрос

Цитата:
Сообщение от serpoverst Посмотреть сообщение
Готовая функция.
Код:
POINT Point_X(POINT a1,POINT a2,POINT a3,POINT a4){
	POINT T;
	if(((a1.x<=T.x)&&(a2.x>=T.x)&&(a3.x<=T.x)&&(a4.x >=T.x))||((a1.y<=T.y)&&(a2.y>=T.y)&&(a3.y<=T.y)&&(a4.y>=T.y))){
		float x1=a1.x,x2=a2.x,x3=a3.x,x4=a4.x,y1=a1.y,y2=a2.y,y3=a3.y,y4=a4.y;
		float k1,k2;
		if(y2-y1!=0){
			k1=(x2-x1)/(y2-y1);
			if(y4-y3!=0){
				k2=(x4-x3)/(y4-y3);
				if(k1!=k2){
					T.x=((a1.x*a2.y-a2.x*a1.y)*(a4.x-a3.x)-(a3.x*a4.y-a4.x*a3.y)*(a2.x-a1.x))/((a1.y-a2.y)*(a4.x-a3.x)-(a3.y-a4.y)*(a2.x-a1.x));
					T.y=((a3.y-a4.y)*T.x-(a3.x*a4.y-a4.x*a3.y))/(a4.x-a3.x);
					T.x*=-1;
					return T;
				}else{
					T.x=969; T.y=969;
					//text2("Паралельны");
				}
			}else{
				T.x=969; T.y=969;
				//text2("Паралельны");
			}
		}else{
			T.x=969; T.y=969;
			//text2("Паралельны");
		}
	}else{
		//text2("Пересечение вне отрезка");
		T.x=979; T.y=979;
		return T;
	}

}
Вот тут поподробнее пожалуйста!
Как быть с делением на 0? Поставьте второй отрезок вертикально и и пересчитайте точку - получите DivideByZeroException
На C# не катит деление на 0, неужели в С++ подругому?
Вопрос 2, как вы входите в первый if, если значения Т неизвестны?
Вопрос 3, что за значения Т в esle, нахаляву?

Последний раз редактировалось Painy; 25.12.2011 в 13:22.
Painy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Площадь пересечения кругов TOSAgrk Помощь студентам 1 05.02.2009 04:23
"Редактор отрезков" Oliver Общие вопросы C/C++ 3 24.12.2008 14:03
VB6.0 График зависимости погрешности от количества отрезков интегрирования. XenoS Помощь студентам 1 22.05.2008 10:22
ActionToolBar. Проблема пересечения компонентов nimf Компоненты Delphi 0 18.10.2007 10:42
Точка на полигоне? Роман Радер Общие вопросы Delphi 14 12.02.2007 17:08