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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 15:26   #1
juan666777
Пользователь
 
Аватар для juan666777
 
Регистрация: 24.01.2009
Сообщений: 84
По умолчанию Как сделать изогипсы ?

Как можно сделать изогипсы с помошью delphi. Кто не знает изогипсы это кривые линии строюшееся по точкам и обведённые плавными линиями .Например в географии они показывают высоты местности.
Есть ли какиенибудь процедуры для их построения? Или может ктонибуть знает как их можно сделать ?
Evil Skull
juan666777 вне форума Ответить с цитированием
Старый 28.01.2009, 19:39   #2
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Наверное Canvas.PolyGon(Mas);
Mas - это массив из координат точек
Манжосов Денис :) вне форума Ответить с цитированием
Старый 28.01.2009, 19:59   #3
juan666777
Пользователь
 
Аватар для juan666777
 
Регистрация: 24.01.2009
Сообщений: 84
По умолчанию

Неподойдёт линии не округлые получаются
Evil Skull
juan666777 вне форума Ответить с цитированием
Старый 28.01.2009, 23:30   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от juan666777 Посмотреть сообщение
Как можно сделать изогипсы с помошью delphi. Кто не знает изогипсы это кривые линии строюшееся по точкам и обведённые плавными линиями .Например в географии они показывают высоты местности.
Есть ли какиенибудь процедуры для их построения? Или может ктонибуть знает как их можно сделать ?
Вариант с кривыми Безье

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
   randomize;
   Height := 600;
   Width  := 800;
   GeneratePoints;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   GeneratePoints;
   Invalidate;
end;

procedure TForm1.GeneratePoints;
var X, DeltaX, i, r : integer;
    a : double;
begin
   count := Random(MaxPoint div 10)+4;
   Label1.Caption := intToStr(count);
   a := 0;
   for i:=1 to count do begin
      r := Random(200)+50;
      M[i-1].X := Width  div 2 + trunc(r * sin(a));
      M[i-1].Y := Height div 2 + trunc(r * cos(a));
      a := a + 2*PI / count;
   end;
end;

procedure TForm1.FormPaint(Sender: TObject);

 procedure TangetPoint(N1:integer; P:TPoint; var A, B:TPoint);
 var N0, N2, L1, L2, L0 : integer;
     P0, P1, P2 : TPoint;
 begin
    // Соседние точки
    N0 := N1-1; if N0 < 0 then N0 := count-1;
    N2 := N1+1; if N2 >= count then N2 := 0;
    A := M[N0];
    B := M[N2];

    // Центральная точка отрезка
    P0.X := A.X + (B.X - A.X) div 2;
    P0.Y := A.Y + (B.Y - A.Y) div 2;

    L0 := trunc( sqrt(sqr(B.X - A.X)+sqr(B.Y - A.Y)) / 2);
    L1 := trunc( sqrt(sqr(P.X - A.X)+sqr(P.Y - A.Y)) / 3);
    L2 := trunc( sqrt(sqr(P.X - B.X)+sqr(P.Y - B.Y)) / 3);

    dec(A.X, P0.X);
    dec(A.Y, P0.Y);
    dec(B.X, P0.X);
    dec(B.Y, P0.Y);
    P0.X := 0; P0.Y := 0;

    // Длина касательной - 1/3 следующего отрезка
    //P1.X := A.X + (B.X - A.X) div 3;
    //P1.Y := A.Y + (B.Y - A.Y) div 3;
    P1.X := trunc(A.X * L1 / L0);
    P1.Y := trunc(A.Y * L1 / L0);

    //P2.X := A.X + (B.X - A.X) div 3 * 2;
    //P2.Y := A.Y + (B.Y - A.Y) div 3 * 2;
    P2.X := trunc(B.X * L2 / L0);
    P2.Y := trunc(B.Y * L2 / L0);

    // Перенос в точку P
    P1.X := P1.X - P0.X + P.X;
    P1.Y := P1.Y - P0.Y + P.Y;

    P2.X := P2.X - P0.X + P.X;
    P2.Y := P2.Y - P0.Y + P.Y;

    A := P1;
    B := P2;
 end;

var i, N1, N2:integer;
    P1, P2 : TPoint;
    A1, B1, A2, B2:TPoint;
begin
   for i:=0 to count-1 do begin
      Canvas.Brush.Color := clTeal;
      Canvas.FillRect( rect(M[i].X-2, M[i].Y-2,
                            M[i].X+2, M[i].Y+2));
      Canvas.Brush.Color := clBtnFace;
      Canvas.TextOut(M[i].X+8, M[i].Y+8, IntToStr(i));
   end;

   for i := 0 to count-1 do begin
      N1 := i;
      N2 := i+1;
      if N2 >= count then N2 := 0;

      P1 := M[N1];
      P2 := M[N2];

      TangetPoint(N1, P1, A1, B1);
      Canvas.Pen.Width := 1;
      Canvas.Pen.Color := clBlack;
      Canvas.MoveTo(A1.X, A1.Y);
      Canvas.LineTo(B1.X, B1.Y);

      TangetPoint(N2, P2, A2, B2);

      Canvas.Pen.Color := clBlue;
      Canvas.Pen.Width := 2;
      Canvas.PolyBezier([P1, B1, A2, P2]);
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 29.01.2009, 17:53   #5
juan666777
Пользователь
 
Аватар для juan666777
 
Регистрация: 24.01.2009
Сообщений: 84
По умолчанию

Спасибо очень помогло
Evil Skull
juan666777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы моя программа при включении отображалась в панели задач, как например часы Window ? asked86 Win Api 1 15.12.2008 08:42
как сделать чтоб экселев. файл висел открытым на рабочем столе как афиша на заборе? Мара Помощь студентам 6 24.07.2008 13:29
как это сделать? DeDoK Общие вопросы Delphi 2 11.07.2008 04:41
Как сделать? killer12rus PHP 4 18.06.2008 16:03