Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как определить все ли отрезки лежат в окружности.


Автор: Fringe 22.4.2010, 21:40
Ув. форумчане, выручите пожалуйста. Не могу понять как можно реализовать данное условие:

Если не все отрезки лежат в окружности, то найти количество отрезков, лежащих в первой четверти. В противном случае найти отрезок наименьшей длины.

Автор: Gluttton 22.4.2010, 22:17
Внутри окружности находятся те отрезки, начало и конец которых находятся внутри окружности. Т.о. задача сводиться к решению задачи определения вхождения точки в окружность.

В окружность входит та точка, которая удалена от цента окружности на величину не более (если учитывать точки на окружности) или менее (для точек расположенных строго внутри окружности) величина радиуса окружности.

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

Полученное значение необходимо сравнить с радиусом.

Возможно я что то напутал, но по-моему так smile ...

Автор: DarkProg 22.4.2010, 22:19
Элементарно.
У вас ведь есть уравнение окружности.
И есть две точки которые являются координатами конца отрезка.
Если отрезок лежит внутри круга, то если подставить координаты одного конца то у вас должно получится значение меньшее квадрата радиуса, и если для второго конца отрезка выполняется это же условие, то весь отрезок лежит внутри окружности.
А узнать все или не все отрезки внутри окружности, то это просто всё условие проверки засовываете в цикл и проверяются все отрезки поочереди.
Для уменьшения числа итераций сразу же проверяйте условие и ищите длину каждого отрезка.

Нахождение минимального числа из множества чисел, описано в любом учебнике по программированию.

Ну вот чуток опередили :(

Автор: Fringe 22.4.2010, 22:33
минимальную длину можно так проверить же?
Код

function min_dl (T:array of real):boolean;
var i:integer; dl,dlmin:real;
begin
 dl:=9999;
  for i := 1 to high(t) do  begin
   dl:=sqrt(sqr(T[i].x-T[i-1].x)+sqr(t[i].y-t[i-1].y));
   if dl<dlmin then
   dl:=dlmin;
  end;
end;

Автор: Fringe 22.4.2010, 23:41
DarkProg,
Код

function vhd_v_okr(T:array of otr):boolean;
 var i:integer; dl:real;
begin  result:=true;
 for i:=0 to High(T) do
 begin
    if ((sqr(T[i].x1)+sqr(t[i].y1)<sqr(T[i].radr)) and
     (sqr(T[i].x2)+sqr(t[i].y2)<sqr(T[i].radr))) then
   result:=false;
   break;
 end;
end;


Правильно я понял?

Автор: DarkProg 23.4.2010, 20:02
Не правильно, должно быть так
Код

function vhd_v_okr(T:array of otr):boolean;
 var i:integer; dl:real;
begin  
result:=true;
for i:=0 to High(T) do
  begin
     if ((sqr(T[i].x1)+sqr(t[i].y1))>sqr(T[i].radr)) and ((sqr(T[i].x2+sqr(t[i].y2))>sqr(T[i].radr)) then 
        begin
          result:=false;
          break;
        end;
  end;
end;


А вообще неужели вам сложно нарисоваь простой пример на листочке с бумагой и посмлтреть правильно ли работает программа или нет???
И в случае ошибок просто вручную проверить где и на каком этапе получается ошибка, или же трассировкой посмотреть.

С длинной вроде верно smile

Кстати существуют такие константы типа Max_Real,  Max_Int т.п. это весьма удодобно если вам заранее нужно придать очень большое значение переменной.

Совет на будущее, оформляйте код в более удобном виде, как для себя так и для тех кто будет смотреть ваш код.
Обычно ступенчатый вид кода очень удобен, потому что сразу видно что у вас в цикле а что вне его, а равнозначные операторы старайтесь писать на одной линии, и если у вас в условии нет альтернативы(ну т.е. else )то пишите в строчку, IMHO так лучше.

Автор: Fringe 23.4.2010, 22:28
DarkProg, спасибо!

Совет приму на заметку smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)