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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 20:22   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Точки персечения окружности и прямоугольника

Вот такой код:
Код:
Procedure FindCrossPt;
var xf1,xf2,yf1,yf2: double;
begin
      CrossCount:=0;
      xf1:=x+sqrt(r*r-y1*y1);
      xf2:=x-sqrt(r*r-y1*y1);
      if (xf1>=x1) and (xf1<=x2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= xf1;
            CrossPtY [CrossCount]:= y1;
      end;
      if (xf2>=x1) and (xf2<=x2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= xf2;
            CrossPtY[CrossCount]:= y2;
      end;
      yf1:=y+sqrt(r*r-x1*x1);
      yf2:=y-sqrt(r*r-x1*x1);
      if (yf1>=y1) and (yf1<=y2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= x1;
            CrossPtY[CrossCount]:= yf1;
      end;
      if (yf2>=y1) and (yf2<=y2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= x2;
            CrossPtY[CrossCount]:= yf2;
      end;
Однако, он не всегда работает правильно. Почему?
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.05.2011, 10:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если правильно понял:
x,y - координаты центра окружности, r - радиус
x1,x2,y1,y2 - координаты сторон прямоугольника
Код:
Procedure FindCrossPt;
var xf1,xf2,yf1,yf2: double;
begin
      CrossCount:=0;
      xf1:=x+sqrt(r*r-(y1-y)*(y1-y));
      xf2:=x+sqrt(r*r-(y2-y)*(y2-y));
      if (xf1>=x1) and (xf1<=x2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= xf1;
            CrossPtY [CrossCount]:= y1;
      end;
      if (xf2>=x1) and (xf2<=x2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= xf2;
            CrossPtY[CrossCount]:= y2;
      end;
      yf1:=y+sqrt(r*r-(x1-x)*(x1-x));
      yf2:=y+sqrt(r*r-(x2-x)*(x2-x));
      if (yf1>=y1) and (yf1<=y2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= x1;
            CrossPtY[CrossCount]:= yf1;
      end;
      if (yf2>=y1) and (yf2<=y2) then
      begin
            CrossCount:= CrossCount+1;
            CrossPtX[CrossCount]:= x2;
            CrossPtY[CrossCount]:= yf2;
      end;
end;
+анализ на неотрицательность подкоренного выражения - нет пересечения даже на продолжении отрезка. Могут быть проблемы из-за точности вычислений при касательной к окружности строны прямоугольника или в случае, когда его вершина лежит на окружности
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.05.2011 в 12:49.
Аватар вне форума Ответить с цитированием
Старый 29.05.2011, 20:28   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ни ваше решение, ни моё предложение не учло того, что точек пересечения прямоугольника с окружностью может быть от 0 до 8. Т.е. нужно рассматривать для неотрицательного подкоренного выражения варианты:
Код:
xf1:=x+sqrt(r*r-(y1-y)*(y1-y));
xf2:=x-sqrt(r*r-(y1-y)*(y1-y));
...
xf1:=x+sqrt(r*r-(y2-y)*(y2-y));
xf2:=x-sqrt(r*r-(y2-y)*(y2-y));
...
yf1:=y+sqrt(r*r-(x1-x)*(x1-x));
yf2:=y-sqrt(r*r-(x1-x)*(x1-x));
...
yf1:=y+sqrt(r*r-(x2-x)*(x2-x));
yf2:=y-sqrt(r*r-(x2-x)*(x2-x));
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PaintBox, определение точек пересечения прямоугольника и окружности _-Re@l-_ Общие вопросы Delphi 0 20.05.2011 16:37
Пересечение прямоугольника и окружности _-Re@l-_ Помощь студентам 2 20.05.2011 15:35
лежат ли точки в окружности powergrean Паскаль, Turbo Pascal, PascalABC.NET 4 17.06.2010 16:17
Вращение точки по окружности BloodMaX Помощь студентам 4 21.12.2009 17:37
даны две точки. организовать движение из точки А в точку Б окружности! Wi1D Помощь студентам 6 23.05.2009 19:55