UNIT Spinner, INTERFACE

USES SysUtils, WinTypes, WinProce, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
PROCEDURE SpinWheels(TargetCanvas : TCanvas;

A, B, D,

CenterX, CenterY : Integer; DrawColor : TColor);
IMPLEMENTATION var A, B, D, I : Integer; Quit : Boolean;

FUNCTION HighestCommonFactor(А,В : Integer) : Integer, var I, J, HCF : Integer; begin { Алгоритм Эвклида для нахождения HCF}

IF_A < В THEN { двух целых А и В )

begin HCF := A; I := В END ELSE begin HCF := B; I := A

END; REPEAT

J := I MOD HCF; IF J О 0 THEN begin
I := HCF; HCF := J END UNTIL J = 0;
HighestCommonFactor := HCF END;

PROCEDURE SpinWheels(TargetCanvas : TCanvas, A,B,D,

CenterX, CenterY : Integer DrawColor : TColor);
var Rab,Lines,I : Integer;
Alpha,Beta,ADif,AoverB : Real;

XPT,YPT : Real; { Линия координат последней точки }

EGIN

RAB := A - В; Alpha := 0.0;
{Константы 100 и 200 управляют здесь плавностью } {изображенных или напечатанных кривых. Большее значение} {должно быть двойным значением того, на что делится} {PI Большее значение делается для большего сглаживания} {кривых, но удлиняет время для рисования, так как} {в нарисованной кривой больше линейных сегментов} ADif := PI/100.0; AoverB := А/В;
Lines := 200 * (В DIV HighestCommonFactor(А,В)); TargetCanvas.Pen.Color := DrawColor;
TargetCanvas . MoveTo ((Round(RAB+D) -t-CenterX) , CenterY) ; FOR I := 1 TO Lines DO begin
Alpha := Alpha + Adif; Beta := Alpha * AoverB;

XPT := RAB * COS(Alpha) + D * COS(Beta); YPT := RAB * SIN(Alpha) - D * SIN(Beta); TargetCanvas.LineTo((Round(XPT)+CenterX),

Round(YPT)+CenterY);

END

END;

END. {Spinner}

Вращение циклоид

В интерфейсном разделе модуля Spinner лишь одна подпрограмма сделана доступной: SpinWhcels, являющаяся подпрограммой, действительно рисующей узоры на полотне. Это полотно может быть - или полотном формы, или полотном принтера. SpinWheels не может указать на различие, но это и неважно

Я не могу описать здесь в деталях, как делает свою работу Spin Wheels, включая в себя сложную геометрию. Можете поверить мне на слово - он эту работу выполняет. Местом в подпрограмме SpinWheels, где вы можете применить определенное воздействие, является пара литеральных числовых констант, которые контролируют - как "сглаживается" генерируемая циклоидная кривая. В опубликованной здесь версии я использовал 100 и 200, но вы можете оперировать почти любыми парами значений, при условии, что второе будет ровно вдвое больше первого. Чем больше эти значения, тем больше будет сглаживание. Возьмите их очень маленькими, вы также получите циклоидную кривую, но она будет до некоторой степени угловатой и непривлекательной. Возьмите их очень большими, и вы получите в самом деле гладкую кривую, но время на их рисование значительно возрастет. Если вы намерены печатать узоры на лазерном принтере с высокой рарешающей способностью (600x600 DPI или больше), вы можете попытаться удвоить обе постоянные до 200 и 400.

И все это происходит благодаря тому, что циклоидная кривая нарисована совершенно прямыми линиями! Правда, это короткие линии, но, тем не менее, линии. Чем больше две постоянные, тем больше линий образовывают кривую, и чем они короче, тем более гладкой будет кривая.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в среде Delphi



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс