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

Вход на сайт

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

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

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

Рекурсия присутствует?
И где эти прикрепленные файлы?
Я код на C++ набрал сам. Строил кривую Безье, но "прилипал" к нулю. То есть я задаю точки далеко от нуля, а он строил из нуля, а потом только обходил предложенные точки. Потом я нашёл Ваш сайт и эту статью. Оказалось, что я забыл возвести t в...
просто я не так понял, здесь мы вращаем точки куба что вращает сам куб. Мне нужно вращать просто 3д объект , данный способ не подходит
Задавайте объект в мировых координатах. Вращайте его относительно мировой системы координат. А при отрисовке преобразуйте в экранные координаты. Посмотрите пример преобразования в экранные координаты.

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

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Lazarus 1.2.4 win32/win64

Генерируем 1/8 часть окружности. Первая точка генерируемого участка окружности имеет координаты (0;радиус). По горизонтали координата X изменяется от 0 до радиус/sqrt(2).

Берём целое, максимально приближенное значение выражения (радиус/sqrt(2)).
Циклом, меняем координату по горизонтали от 0 до (радиус/sqrt(2)), увеличивая её на 1 до того момента, пока координата <=round(радиус/sqrt(2)).

В цикле ищем наиболее подходящее значение по вертикали Y. Для этого находим d1=|радиус2-X2-Y2| и d2=|радиус2-X2-(Y-1)2|. Нас интересует, какое из этих выражений ближе к нулю. Если d1>d2, то уменьшаем значение Y на единицу. Иначе — оставляем значение неизменным. Полученные координаты отражаем 7 раз.
Получаем 8 точек
( X, Y); ( Y, X);
( X,-Y); ( Y,-X);
(-X, Y); (-Y, X);
(-X,-Y); (-Y,-X);

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

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons;
type
  { TForm1 }
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    PaintBox1: TPaintBox;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
 
procedure Circle(x_,y_,r_:integer;colour:TColor);
var x,y,d1,d2:integer;
  begin
   x:=0;
   y:=r_;
   while ( x<=round(r_/sqrt(2)) )
   do begin
 
   Form1.PaintBox1.Canvas.Pixels[x_+x,y_+y]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_+x,y_-y]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_-x,y_+y]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_-x,y_-y]:=colour;
 
   Form1.PaintBox1.Canvas.Pixels[x_+y,y_+x]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_+y,y_-x]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_-y,y_+x]:=colour;
   Form1.PaintBox1.Canvas.Pixels[x_-y,y_-x]:=colour;
 
   x:=x+1;
   d1:=ABS(r_*r_-x*x-y*y);
   d2:=ABS(r_*r_-x*x-(y-1)*(y-1));
   if(d1>d2)  then  y:=y-1;
   end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Circle(200,200,100,ClBlack);
end;
end.

Прикрепленный файлРазмер
riza_circle.rar685.84 кб