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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 15:14   #11
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от warca Посмотреть сообщение
а в чем же тогда ошибка?
В том, что надобно считать точки пересечения, а не "целые между расстояниями от начала координат до первой точки и до второй".
Это решение подошло бы для случая с положительными координатами.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 17.10.2011, 15:24   #12
warca
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 51
По умолчанию

хмм.а как же тогда можно это написать?
warca вне форума Ответить с цитированием
Старый 17.10.2011, 16:17   #13
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

warca, вот Вам рабочий код:
Код:
program Project13;

function max(v1,v2:double):double;
begin
 if v1>v2 then result:=v1 else
 result:=v2;
end;

function min(v1,v2:double):double;
begin
 if v1<v2 then result:=v1 else
 result:=v2;
end;

 // отрезок с кругом
function CrossLineToCircle(x0,y0,x1,y1,radius : double): integer;
var A0,B0, A,B,C, D: double;
begin
 result:=0;
 if X1-X0<>0 then
 begin
  A0:=(Y1-Y0)/(X1-X0);
  B0:=Y1-A0*X0; D:=b0;
  A:=sqr(A0)+1; B:=2*A0*D;
  c:=sqr(D)-sqr(radius);
  D:=sqr(b)-4*A*C;
  if (D<0) then exit;
  C:=(-b+sqrt(D))/(2*a);
  if (C<=max(X1, X0)) and (C>=min(X0, X1))) then inc(result);
  D:=(-b-sqrt(D))/(2*a);
  if (D<>C) and ((D<=max(X1, X0)) and (D>=min(X1, X0))) then inc(result);
 end else
 begin
  C:=sqr(X1)-sqr(Radius);
  D:=sqr(B)-4*C;
  if D<0 then exit;
  A0:=sqrt(D)/2;
  if (a0<=max(Y0,Y1)) and (a0>=min(Y0, Y1))then inc(result);
  A:=-sqrt(D)/2;
  if (a0<>a) and ((A<=max(Y0,Y1)) and (A>=min(Y0,Y1))) then inc(result);
 end;
end;


var x0,y0     : double;
    x1,y1     : double;
    rmin,rmax : integer;
    count,c1 : integer;

begin
  writeln('Enter first point (X Y)'); read(x0,y0);
  writeln('Enter second point (X Y)');read(x1,y1);
  count :=0;
  rmin:=1;
  rmax:= trunc(max(max(x0,x1),max(y0,y1)))+1;
  while rmin<=rmax do
  begin
   c1:= CrossLineToCircle(x0,y0,x1,y1, rmin);
   writeln(rmin,' cross = ',c1);
   count :=count+c1;
   rmin:=rmin+1;
  end;
  writeln(' cross count = ',count);
end.
r min и r max у меня считается примитивно, тупо от 1 до максимального из значений. Персчёт можно усовершенствовать , но думаю смысла нет. Согласно Вашему условию Эти числа не превосходят 10^3. Посему
1000 проходов от r min до r max, в холостую, не затормозят работу программы.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 17.10.2011 в 16:51. Причина: исправил неявные условия в inc(result-е
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 16:26   #14
warca
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 51
По умолчанию

Код:
inc(result, byte((C<=max(X1, X0)) and (C>=min(X0, X1))));

тут ошибка.что то не понимаю,почему она выявляется. "Невозможно явно преобразовать тип boolean к типу byte"
warca вне форума Ответить с цитированием
Старый 17.10.2011, 16:50   #15
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
if (C<=max(X1, X0)) and (C>=min(X0, X1)) then result:=result+1;
и так по всем подобным.
ссори но функцию я переписывал с дельфийной библиотеки для картографии убирая центр (у тебя он в 0,0), а эти вещи поропустил
В коде выше поравил всё
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 17:02   #16
warca
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 51
По умолчанию

все.понял ошибку
warca вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрезок. Отсечение stscolt Помощь студентам 0 11.11.2009 00:29
Дивижение окружности по окружности Irina8340 Помощь студентам 10 13.05.2009 20:25
Отрезок Witaliy Помощь студентам 5 14.02.2009 19:46
движение окружности по окружности MyQwErTy Помощь студентам 13 04.11.2008 22:52