Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 679

•  TDictionary Custom Sort  5 814

•  Fast Watermark Sources  5 613

•  3D Designer  8 238

•  Sik Screen Capture  5 935

•  Patch Maker  6 396

•  Айболит (remote control)  6 389

•  ListBox Drag & Drop  5 246

•  Доска для игры Реверси  94 575

•  Графические эффекты  6 580

•  Рисование по маске  5 657

•  Перетаскивание изображений  4 769

•  Canvas Drawing  5 144

•  Рисование Луны  4 877

•  Поворот изображения  4 424

•  Рисование стержней  3 126

•  Paint on Shape  2 369

•  Генератор кроссвордов  3 238

•  Головоломка Paletto  2 559

•  Теорема Монжа об окружностях  3 337

•  Пазл Numbrix  2 210

•  Заборы и коммивояжеры  2 857

•  Игра HIP  1 831

•  Игра Go (Го)  1 751

•  Симулятор лифта  2 081

•  Программа укладки плитки  1 808

•  Генератор лабиринта  2 249

•  Проверка числового ввода  1 934

•  HEX View  2 236

•  Физический маятник  1 919

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Рисование звёзд и многоугольников



Автор: Fenik

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Рисование звёзд и многоугольников

Зависимости: Windows, Graphics
Автор:       Fenik, chook_nu@uraltc.ru, Новоуральск
Copyright:   Автор Федоровских Николай
Дата:        3 июня 2002 г.
***************************************************** }

procedure DrawStar(Canvas: TCanvas; Center, Pos: TPoint;
  R2inPercent, Ends: Byte; DrawCircle: Boolean);
{
 Рисование звёзд и многоугольников

 Center - центр фигуры;
 Pos - точка, лежащая на внешнем радиусе;
 R2inPercent - сколько процентов от внешнего радиуса составляет внутренний;
 Ends - число концов (внешних углов) фигуры;
 DrawCircle - описывать или нет возле фигуры окружность;

 R2inPercent рекомендую брать в промежутке [0; 100].
 Если R2inPercent = 100, то рисуется правильный многоугольник,
 число углов которого равно Ends.
 Все точки лежат на двух окружностях, чередуясь.
}

  function Max(A, B: Integer): Integer;
  begin
    if A > B then
      Result := A
    else
      Result := B;
  end;

  function ArcTan2(Y, X: Extended): Extended;
  asm
    FLD Y
    FLD X
    FPATAN
    FWAIT
  end;

const
  Rad = Pi / 180;
var
  R, r2, rd, len: Word;
  i: Integer;
  MemBS: TBrushStyle;
  p: array of TPoint;
  MemC: TColor;
  a, ad: Double;
begin
  if Ends < 2 then
    Exit;
  {начальный угол:}
  a := ArcTan2(Center.y - Pos.y, Pos.x - Center.x) * (180 / Pi);
  R := Max(Abs(Center.x - Pos.x), Abs(Center.y - Pos.y));
  r2 := Round(R / 100 * R2inPercent); {внутренний радиус}
  if R2inPercent <> 100 then
    len := Ends * 2
  else
    len := Ends;
  SetLength(p, len); {устанавливаем длину массива точек}
  ad := 360 / len; {угол между рядом стоящими точками}
  for i := 0 to len - 1 do
  begin
    {если i нечетный, то радиус внутренний, иначе - внешний}
    if Odd(i) then
      rd := r2
    else
      rd := R;
    p[i].x := Trunc(Cos(a * Rad) * rd) + Center.x;
    p[i].y := Trunc(Sin(a * Rad) * rd) + Center.y;
    a := a + ad; {увеличиваем угол}
  end;
  {рисуем многоугольник}
  Canvas.Polygon(p);
  if DrawCircle then
  begin
    {Рисуем окружность}
    MemC := Canvas.Brush.Color;
    MemBS := Canvas.Brush.Style;
    Canvas.Brush.Style := bsClear;
    Canvas.Ellipse(Center.x - R, Center.y - R, Center.x + R, Center.y + R);
    Canvas.Brush.Color := MemC;
    Canvas.Brush.Style := MemBS;
  end;
end;

Пример использования:

DrawStar(FBitmap.Canvas, Point(FBitmap.Width div 2, FBitmap.Height div 2),
  Point(FBitmap.Width div 2, 0), 20, 12, False); 




Похожие по теме исходники

Рисование кривой звука

Рисование математических формул

Рисование компаса

Рисование стержней

 

Рисование Луны

Рисование по маске

Имитация звездного неба




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте