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

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

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

 
 Ответить  Открыть новую тему 
> Точки треугольника
сообщение
Сообщение #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 при вычислении то-ли косинуса, то-ли синуса. как мне это исправить?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


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


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


Гость






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

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


Новичок
*

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

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


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

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


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

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

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

где флуд?


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


Гость






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

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

Сообщение отредактировано: Oleg_Z -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

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

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


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


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


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

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

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


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


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


Гость






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

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

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

 





- Текстовая версия 11.05.2024 22:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name