Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Геометрические задачи на PASCAl
Посл.ответ Сообщение

Ранг: 2.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 января 2008 18:53
· Личное сообщение · #1

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



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 января 2008 19:06
· Личное сообщение · #2

y=kx+b уравнение прямой
Если k первой прямой равен k второй прямой то линии паралельный => не перескаются
ЗЫ. Открой учебник по геометрии за 5 класс



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 23 января 2008 19:13 · Поправил: Enigma
· Личное сообщение · #3

На счет прямых:
Первая задана уравнением: y1=ax1+b
Вторая: y2=cx2+d
Если прямые пересекаются, значит в этой точке y1=y2, x1=x2

Привоим все в систему
y=ax+b
y=cx+d

Получается, точка пересечения будет тут:
x = (d-b)/(a-c) (y - сам посчитаешь)

Не пересекаюся если a=c

Топегспартер, тебе не на олимпиаду надо, а в школу почаще ходить...




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 23 января 2008 19:15
· Личное сообщение · #4

Ну и как это относится к тематике данного форума? Эту тему ПОКА не закрываю, хотя явный кандидат на закрытие, подобные темы надо постить на форумах для программистов на паскале.



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 23 января 2008 19:17
· Личное сообщение · #5

На счет отрезков, строить по координатам уравнение прямой, вычисляешь точку пересечения, потом проверяешь, принадлежит ли она обоим отрезкам!



Ранг: 158.7 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 23 января 2008 19:22
· Личное сообщение · #6

Пересечение отрезков http://program.rin.ru/cgi-bin/print.pl?id=646
Вообще погуглил 5 минут и вся инфа у тебя в кармане.
Печально.... ничего не скажешь...

-----
Я ещё не волшебник, я только учусь...




Ранг: 2.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 января 2008 12:49 · Поправил: AC
· Личное сообщение · #7

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




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 24 января 2008 13:28
· Личное сообщение · #8

AC а ты не наезжай, как задал вопрос, так на него и ответили.

-----
Yann Tiersen best and do not fuck




Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 24 января 2008 14:29
· Личное сообщение · #9

AC пишет:
а насчет вычислять точку пересечения и смотреть принадлежит ли она обоим отрезкам вопрос: как заставить программу это сделать?


координаты одного отрезка (x1, y1) (x2, y2)
если точка пересечения (x, y)
то принадлежность точки отрезку проверяешь вот так:
if (x in [x1..x2]) and (y in [y1..y2]) then
// Точка принаждежит отрезку
Уж проверку на то что x1 должен быть меньше x2 и тоже самое с у - сделаешь сам.
А вот если ты не знаешь как их двух вершин отрезка построить уравнение прямой, то тебе точно на олимпиаду ходить нельзя!



Ранг: 2.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 января 2008 14:36
· Личное сообщение · #10

Enigma пишет:
координаты одного отрезка (x1, y1) (x2, y2)
если точка пересечения (x, y)
то принадлежность точки отрезку проверяешь вот так:
if (x in [x1..x2]) and (y in [y1..y2]) then
// Точка принаждежит отрезку
Уж проверку на то что x1 должен быть меньше x2 и тоже самое с у - сделаешь сам.
А вот если ты не знаешь как их двух вершин отрезка построить уравнение прямой, то тебе точно на олимпиаду ходить нельзя!

мне можно ) уравнение могу построить, но кажется есть способ который кроме координат ничего не требует, то есть условие поиска без коэффициентов, при котором минимальное кол-во операций




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 24 января 2008 14:45
· Личное сообщение · #11

AC пишет:
вычислять точку пересечения и смотреть принадлежит ли она обоим отрезкам вопрос: как заставить программу это сделать? перебор тут не сильно поможет имхо иррацанальные и корни

Какой в жопу перебор?
Какую тебе олимпиаду???
AC пишет:
тут через векторы нужно

тут можно и без векторов... но уж если очень хочецца, то вот через них
точка A(x,y) отрезок с концевыми точками B(x1,y1) и C(x2,y2)
Точки отрезка z можно описать уравнением
pOB+(1-p)OC=z, 0<=p<=1, OB и OC - векторы.
Если существует такое p, 0<=p<=1, что
pOB+(1-p)OC=A,
то A лежит на отрезке, иначе - нет.
Равенство (*) расписывается по координатно так:
px1+(1-p)x2=x
py1+(1-p)y2=y
Из первого уравнения находим p, подставляем во второе: если получаем равенство и
0<=p<=1, то A на отрезке, иначе - нет.
PS: я бы на твоём месте на олимпиаду не ехал ;)

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 24 января 2008 14:54 · Поправил: Isaev
· Личное сообщение · #12

Enigma пишет:
if (x in [x1..x2]) and (y in [y1..y2]) then

не знаю как в других языках, но в Delphi это глючить будет, если x2,y2 не уложутся в байт
лучше in не использовать... он работает [0..255]

AC тебе вообще для 2D или для 3D надо?

--> маленький ликбез <-- http://faqs.org.ru/science/geometry_faq.htm на будущее

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 24 января 2008 16:38
· Личное сообщение · #13

ох уж эти юные дарования
algolist.manual.ru/maths/geom/intersect/lineline2d.php

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 января 2008 06:32
· Личное сообщение · #14

Вот кусок моей реализации:

X11 – X первой точки первого отрезка
X12 – X второй точки первого отрезка

X21 – X первой точки второго отрезка
X22 – X второй точки второго отрезка

#define EPSYLON 1E-16

bool IsCrossing( ....)
{
long idx2;
bool bRes = false;
double delta;
double D[3] = { X12 – X11, Y12 – Y11, Z12 – Z11};
double E[3] = { X22 – X21, Y22 – Y21, Z22 – Z21};
for ( long idx1 = 0; idx1 < 3; idx1++)
{
if (idx1 < 2) idx2 = ( idx1 + 1) % 3;
delta = E[idx1] * D[idx2] - E[idx2] * D[idx1];
if ( fabs( delta) > EPSYLON)
{
bRes = true;
break;
}
}
return bRes;
}




Ранг: 90.3 (постоянный), 1thx
Активность: 0.030
Статус: Участник

Создано: 01 февраля 2008 15:12
· Личное сообщение · #15

AC, неделя прошла. Как там олимпиада, выиграл?


 eXeL@B —› Программирование —› Геометрические задачи на PASCAl
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати