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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2009, 18:01   #1
DjDizzy
 
Регистрация: 29.09.2008
Сообщений: 6
Вопрос Помогите с алгоритмом построения сегмента

Добрый день!

Помогите пожалуйста найти алгоритм построения сегмента.

Имеется:
1. Координаты точки A, точки B (соответсвенно знаем хорду AB)
2. Длина сегмента AB либо высота CD


Рис 42:


p.s. Надо на Pascal'e или Delphi.

Заранее спасибо!

Последний раз редактировалось DjDizzy; 09.02.2009 в 18:41.
DjDizzy вне форума Ответить с цитированием
Старый 09.02.2009, 19:42   #2
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

На ум приходит только вот что:
1) a=m/r;
2) h/2 = r*sin(a/2);
где
a - угол AOB (в радианах),
h - длина хорды AB.
Тогда, решая систему двух уравнений, получим следующее уравнение:
a=2*m*sin(a/2)/h
Алгоритм:
1) Организуем цикл для значений a=0...2*Pi и проверяем равенство a=2*m*sin(a/2)/h.
2) После того, как нашли a, находим r=m/a.
3) Строим сектор по известным a и r.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 09.02.2009, 22:21   #3
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Вот программа, реализующая приведенный мной выше алгоритм (сыровата правда):
Код:
uses graph,crt;
const
  xc=200;
  yc=200;
var
  gd,gm,i,j,dx,dy:integer;
  r,h,m,a,a1:real;
begin
  write('h=');
  readln(h);
  write('m=');
  readln(m);
  for i:=359 downto 1 do
  begin
    a:=i*PI/180;
    a1:=2*m*sin(a/2)/h;
    if abs(a-a1)<=PI/180 then break;
  end;
  r:=m/a;
  gd := Detect;
  InitGraph(Gd,Gm,'e:\tp7\bgi');
  for j:=1 to round(i/2) do
  begin
    dx:=round(sin(j*PI/180)*r);
    dy:=round(cos(j*PI/180)*r);
    line(xc,yc,xc+dx,yc-dy);
    line(xc,yc,xc-dx,yc-dy);
  end;
  readkey;
  closegraph;
end.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)

Последний раз редактировалось bag; 10.02.2009 в 20:48. Причина: Проверка на отсутствие решения не нужна
bag вне форума Ответить с цитированием
Старый 10.02.2009, 17:20   #4
DjDizzy
 
Регистрация: 29.09.2008
Сообщений: 6
По умолчанию

Спасибо! То что нужно!

А если у нас вместо длины сегмента AB известна высота CD?
DjDizzy вне форума Ответить с цитированием
Старый 10.02.2009, 20:46   #5
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Тогда тем же способом решаем уравнение:
(r-y1)*(r-y1)=r*r - h*h/4,
где
y1 - высота CD,
h - длина хорды AB.
Т.е.
1) Организуем цикл для значений r=0...rmax и проверяем равенство (r-y1)*(r-y1)=r*r - h*h/4.
2) После того, как нашли r, находим a=2*arctg(x/(r-y1)), правильно обработав ситуацию, если r-y1=0.
3) Строим сектор по известным a и r.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с алгоритмом программы Evgenii Помощь студентам 10 07.11.2008 16:07
помогите с алгоритмом Фибоначчи kardan Помощь студентам 8 01.04.2008 20:22
Помогите с алгоритмом сжатия изображения Kulibim Мультимедиа в Delphi 3 20.12.2007 19:33
Помогите с алгоритмом Цезаря!!! Пожалуйста ***СкаЙ*** Помощь студентам 6 05.04.2007 11:10