IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> пересечение отрезков
milfes
сообщение 5.01.2007 21:40
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Пожалуйсто помогите решить задачу:
Дано множество отрезков, заданых координатами концов. Определить количество точек пересечения.
Вот что я сам написал:

program graphpoints;
uses crt,graph;
const nmax=100;
type t_kor=record
xn,yn,xk,yk:integer;
end;
var kor:array[1..nmax] of t_kor;
i,k,n,j,y,maxx,maxy,driver,mode:integer;
r1,r2,ra,rb,r:real;

procedure generatedata;
var i:integer;
begin
for i:=1 to n do
begin
kor[i].xn:=random(maxx);
kor[i].yn:=random(maxy);
kor[i].xk:=random(maxx);
kor[i].yk:=random(maxy);
line(kor[i].xn,kor[i].yn,kor[i].xk,kor[i].yk);
end;
end;

begin
randomize;
write('Введите количество отрезков ');
readln(n);
driver:=detect;
initgraph(driver,mode,'d:\tp\bgi');
maxx:=getmaxx;
maxy:=getmaxy;
generatedata;
readkey;
closegraph;
k:=0;
for i:=1 to n-1 do
begin
for j:=i+1 to n do
begin
r1:=(kor[j].xn-kor[i].xn)*(kor[i].yk-kor[i].yn)-(kor[j].yn-kor[i].yn)*(kor[i].xk-kor[i].xn);
r:= (kor[i].yk-kor[i].yn)*(kor[j].xn-kor[j].xk)-(kor[j].yn-kor[j].yk)*(kor[i].xk-kor[i].xn);
r2:=(kor[j].xn-kor[j].xk)*(kor[j].yn-kor[i].yn)-(kor[j].yn-kor[j].yk)*(kor[j].xn-kor[i].xn);
ra:=r1/r;
rb:=r2/r;
if (ra<=1) and (ra>=0) and (rb>=0) and (rb<=1) then
k:=k+1
end;
end;
writeln('Количество точек пересечения ',k);
readkey;
end.



Программа работает неправильно, число пересечение выводится меньше, чем на самом деле.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 5.01.2007 21:51
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


У тебя не правильно проверяются пересечение отрезков, глянь здесь


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
milfes
сообщение 5.01.2007 22:04
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Спасибо, ща попробую исправить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
milfes
сообщение 6.01.2007 1:28
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Вот изменил:

r1:=(kor[j].xk-kor[j].xn)*(kor[i].yn-kor[j].yn)-(kor[j].yk-kor[j].yn)*(kor[i].xn-kor[j].xn);
r:= (kor[j].yk-kor[j].yn)*(kor[i].xk-kor[i].xn)-(kor[i].yk-kor[i].yn)*(kor[j].xk-kor[j].xn);
r2:=(kor[i].xk-kor[i].xn)*(kor[i].yn-kor[j].yn)-(kor[i].yk-kor[i].yn)*(kor[i].xn-kor[j].xn);


Но результат остался прежним. mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.01.2007 2:18
Сообщение #5


Гость






milfes, у тебя может не хватать разрядности (промежуточный результат вычисления, например, (kor[j].xk-kor[j].xn)*(kor[i].yn-kor[j].yn), не поместится в Integer, и усечется - в результате получишь неверные значения Ra, Rb) и в итоге - некорректный результат... Я бы переходил сразу на Real:

r1:=1.0 * (kor[j].xk-kor[j].xn) * 1.0 * (kor[i].yn-kor[j].yn)-
1.0 * (kor[j].yk-kor[j].yn) * 1.0 * (kor[i].xn-kor[j].xn);
r:= 1.0 * (kor[j].yk-kor[j].yn) * 1.0 * (kor[i].xk-kor[i].xn)-
1.0 * (kor[i].yk-kor[i].yn) * 1.0 * (kor[j].xk-kor[j].xn);
r2:=1.0 * (kor[i].xk-kor[i].xn) * 1.0 * (kor[i].yn-kor[j].yn)-
1.0 * (kor[i].yk-kor[i].yn) * 1.0 * (kor[i].xn-kor[j].xn);
- тогда промежуточные значения гарантированно будут в типе Real, и результат должен быть правильным... Попробуй...
 К началу страницы 
+ Ответить 
milfes
сообщение 6.01.2007 2:30
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"