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

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

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

 
 Ответить  Открыть новую тему 
> Точки треугольника
vano
сообщение 17.02.2005 13:50
Сообщение #1


Гость






Пожалуйста, помогите с решением вот такой задачки:

Задан треугольник (x1,y1,x2,y2,x3,y3) . Вычислить, какие точки с целыми координатами находятся внутри него и вывести в отдельный файл их количество и координаты.

У меня получилось такое:

Код

Program tochki_treugolnika;
uses crt;
var
  f : text;
  i, j, ymin, ymax, xmin, xmax, x1, y1, x2, y2, x3, y3, x, y, k : integer;


function rasst ( x1, x2, y1, y2 : real) : real;
  begin
     rasst := sqrt(sqr(x2-x1)+sqr(y2-y1))
  end;

function Angle ( c, a, b : real) : real;
var mycos, mysin : real;
  begin
     mycos := (a*a+b*b-c*c)/(a*b)/2;
     mysin := sqrt (1 - sqr (mycos));
     Angle := arctan (mysin/mycos)
  end;

function gde (x1,y1,x2,y2,x3,y3,x,y:real) : boolean;
  var
     an1, an2, an3 : real;
  begin
     an1 := Angle (rasst (x1, x2, y1, y2), rasst (x1, x, y1, y), rasst (x2, x, y2, y));
     an2 := Angle (rasst (x2, x3, y2, y3), rasst (x2, x, y2, y), rasst (x3, x, y3, y));
     an3 := Angle (rasst (x3, x1, y3, y1), rasst (x3, x, y3, y), rasst (x1, x, y1, y));
     gde := (an1 + an2 + an3 > 2*PI - 0.01)
  end;




begin
  clrscr;


  writeln ('Введите x1,y1,x2,y2,x3,y3');
  readln (x1,y1,x2,y2,x3,y3);

  {Assign (f,'c:\Pascal\samples\sample33.txt');
  Rewrite (f);
   }

  if x3 < x1 then
     if x2 < x3 then xmin := x2
     else xmin := x3
  else if x2 < x1 then xmin := x2 else xmin := x1;


  if x3 > x1 then
     if x2 > x3 then xmax := x2
     else xmax := x3
  else if x2 > x1 then xmax := x2 else xmax := x1;



  if y3 < y1 then
     if y2 < y3 then ymin := y2
     else ymin := y3
  else if y2 < y1 then ymin := y2 else ymin := y1;


  if y3 > y1 then
     if y2 > y3 then ymax := y2
     else ymax := y3
  else if y2 > y1 then ymax := y2 else ymax := y1;

  for x := xmin + 1 to xmax - 1 do
      for y := ymin + 1   to ymax - 1 do
          begin
               if gde (x1,y1,x2,y2,x3,y3,x,y) = false
               then
               begin
                    writeln ('Точка (',x,';',y,') находится внутри треугольника ');
                    inc(k);
               end;
          end;
  writeln ('f, ');
  writeln ( 'f‚ В треугольнике находится ',k,' точек');
 { close (f);}



  repeat until keypressed
end.



У меня возникает глюк в функции Angle при вычислении то-ли косинуса, то-ли синуса. как мне это исправить?
 К началу страницы 
+ Ответить 
volvo
сообщение 17.02.2005 13:58
Сообщение #2


Гость






vano, я бы все-таки переписал функцию Angle, чтобы не было проблем при mycos = 0...

Код
function Angle ( c, a, b : real) : real;
var mycos, mysin : real;
 begin
    mycos := (a*a+b*b-c*c)/(a*b)/2;
    mysin := sqrt (1 - sqr (mycos));
    if abs(mycos) < 10E-4 then
      Angle := Pi/2
    else Angle := arctan (mysin/mycos)
 end;
 К началу страницы 
+ Ответить 
Михаил Густокашин
сообщение 17.02.2005 17:34
Сообщение #3


Новичок
*

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

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


можно заменить проверку условия на более простую: из точки проводить луч в любую сторону (например, влево) и считать количество пересечений луча со сторонами. если сторона полностью лежит на луче, то не добавлять ничего, если проходит через нижнюю точку стороны треугольника - тоже ничего, через верхнюю - добавлять.
если количество пересечений нечетно (в данном случае только 1, но алгорим универсальный и работает для любых многоугольников без самопересечений и самокасаний, в т.ч. невыпуклых) - то точка лежит внутри фигуры, иначе - вне.


--------------------
учим школьников программированию (и математике до кучи): информация здесь: Webpage
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.02.2005 17:48
Сообщение #4


Гость






Михаил Густокашин, человек ясно сказал:
Цитата(vano @ 17.02.05 12:50)
У меня возникает глюк в функции Angle при вычислении то-ли косинуса, то-ли синуса. как мне это исправить?

Предложения с Вашей стороны по теме вопроса есть? Если нет, извините, это флуд...
 К началу страницы 
+ Ответить 
Михаил Густокашин
сообщение 17.02.2005 17:55
Сообщение #5


Новичок
*

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

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


Цитата(volvo @ 17.02.05 17:48)
Михаил Густокашин, человек ясно сказал:

Предложения с Вашей стороны по теме вопроса есть? Если нет, извините, это флуд...


да, есть. человек писал:
"Пожалуйста, помогите с решением вот такой задачки:

Задан треугольник (x1,y1,x2,y2,x3,y3) . Вычислить, какие точки с целыми координатами находятся внутри него и вывести в отдельный файл их количество и координаты."

я предложил вариант решения, который прост и универсален.

где флуд?


--------------------
учим школьников программированию (и математике до кучи): информация здесь: Webpage
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.02.2005 18:15
Сообщение #6


Гость






Ну поймите Вы наконец... Человек пришел не за советами по изменению алгоритма, а с конкретным вопросом по программе... Глаза наверх поднимите - форум "Задачи", не теория, не обсуждение правильности алгоритма, а "Задачи". Тогда реализуйте Ваш вариант, и предложите его... Пока, кроме слов, я не вижу ничего...

Именно, в этом форуме предпочитают не болтать а показыват ькод, теория "форумом выше" smile.gif Админ.

Сообщение отредактировано: Oleg_Z - 17.02.2005 18:19
 К началу страницы 
+ Ответить 
Михаил Густокашин
сообщение 17.02.2005 18:24
Сообщение #7


Новичок
*

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

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


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


--------------------
учим школьников программированию (и математике до кучи): информация здесь: Webpage
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 17.02.2005 18:28
Сообщение #8


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


Михаил Густокашин, я здесь уже год, поверь, таких, кто хочет разобрать 1 из 1000 если не меньше ;)


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 17.02.2005 18:44
Сообщение #9


Гость






volvo, спасибо за подсказку, не сообразил.

Михаил Густокашин, спасибо за идею, надо попробовать.
 К началу страницы 
+ Ответить 

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

 



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