Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

Счетчики и рейтинг

Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Lazarus

Алгоритм работает на основе заданной точки (x,y), которая является центром многоугольника, R - расстоянием от центра до ближайшей стороны и числу k, говорящее о количестве сторон. Смысл алгоритма заключается в том, что мы образно рисуем окружность вокруг центровой точки с радиусом R. И разрезаем её на k частей под углом z:=z+k, где k=360/k.

Код программы: 

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure lineAngle(x, y, R, angle :integer);
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    var x,y,R,k,z,i:integer;
    var a: array[1..100] of integer;
    var b: array[1..100] of integer;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
procedure TForm1.lineAngle(x, y, R, angle :integer);
begin
  // Round - смещение по кругу; y отрицательный потому что в компьютере он идёт наоборот
  a[i]:=Round(x+cos(angle/180*pi)*R);
  b[i]:=Round(y-sin(angle/180*pi)*R);
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=210; y:=210; R:=100; // x и y - центр многоугольника
  k:=8; // k- количество сторон
 
  k:=360 div k;
  i:=0;
 
  //Запоминаем все точки. 360+k т.к. пропускаем вначале первую точку.
  while z<=360+k do
  begin
    i:=i+1; // Написал перед, потому что Lazarus почему-то присваивает 360, если после
    lineAngle(x,y,R,z);
    z:=z+k;
  end;
 
  // Соединяем все полученные точки
  while i-2>0 do
  begin
    i:=i-1;
    canvas.line(a[i],b[i],a[i-1],b[i-1]);
  end;
end; 
 
end.

Прикрепленный файлРазмер
Исходный код2.2 кб