--- Добавлено в 2023-03-29 00:31:38
Там как раз есть то что я собирался сам делать - рисовать спираль. Я делаю сканер цветов нарисованных калейдоскопом для создания мелодии.. Хотя спираль можно просто сделать уже и из вышестоящей схемы - просто увеличивая радиус одновременно с разверткой по градусам..
Код Дельфи с того ресурса:
Построитель спирали
// Создать траекторию спирали
function CreateSpiralPoints(const ARect: TRect; APoints: TList<TPoint>;
ASpiralCount: Integer = 10 ): Integer;
const
DR = PI/180;
var
ctr: TPoint;
i: Integer;
p: TPoint;
d, w, v, Q: Double;
begin
// Чистим список
APoints.Clear;
// Спираль будет начинаться от центра
ctr := ARect.CenterPoint;
// Сразу же этот центр и добавляем
APoints.Add(ctr);
// Максимальный радиус для спирали
Q := Min(ARect.Width, ARect.Height)/2;
// Приращение на каждый градус
d := Q / (360 * ASpiralCount);
// Пока не знаю какая длина
Result := 0;
// Радиус спирали равен 0
w := 0;
// Пока радиус не достиг максимального радиуса
while w < Q do
begin
// Делаем оборот на 360 градусов
for i := 1 to 360 do
begin
// Считаем угол в радианах
v := i * DR;
// Находим координаты
p.X := Round(ctr.X + cos(v)*w);
p.Y := Round(ctr.Y - sin(v)*w);
// Добавляем точку в траекторию
APoints.Add(P);
// Радиус увеличиваем на приращение
w := w + d;
end;
// Тупо суммируем как длины окружностей
Result := Result + Round(2*PI*w);
end;
end;
--- Добавлено в 2023-03-29 00:51:10
Вот интересная спираль получилась) Только как сделать чтобы регулировать раздельно расстояние между витками и точками спирали? Буду тот код с твоего сайта изучать.
Add(Img_Point,10361775,455,315)
{
Color=-16777203
Size=10
Point(X)
Point(Y)
link(onDraw,12465343:doRefresh,[(499,321)(499,265)(443,265)(443,209)])
link(Bitmap,12465343:Bitmap,[])
link(X,14307840:Result,[(468,303)(335,303)])
link(Y,16095580:Result,[(475,303)(384,303)])
}
Add(Timer,11502362,126,329)
{
Interval=100
AutoStop=360
link(onTimer,1782630:doEvent1,[])
}
Add(Hub,1782630,210,329)
{
link(onEvent1,15911703:doNext,[(234,335)(234,328)])
}
Add(MainForm,5818658,140,161)
{
@Hint=#8:(c) Aziz|
Width=500
Height=500
Caption="Рисование окружности по формуле"
}
Add(PaintBox,12465343,455,203)
{
Left=55
Top=10
Width=245
Height=218
Align=5
Color=16777215
WinStyle=1
ColorSp=0
Point(onClick)
}
Add(MathParse,14307840,329,259)
{
@Hint=#38:Math.sin((Math.PI * angl / 180) / 2), |30:x = 150 + R * cos ((pi *2)* t)|31:y = 150 + R * sin (-(pi *2)* t)|27:%3 + %2 * cos ((pi *2)* %1)|
DataCount=3
MathStr="%3 + %2 * cos (%1)"
link(X2,9867155:Var2,[(342,229)(321,229)])
link(X3,11880627:Var2,[(349,229)(363,229)])
}
Add(CounterEx,10043336,245,203)
{
Min=10
Max=150
Step=2
Default=10
Point(doReset)
link(onNext,13135093:doValue,[(296,209)(296,174)])
}
Add(For,8238168,231,280)
{
End=359
}
Add(MathParse,16095580,378,259)
{
@Hint=#30:x = 150 + R * cos ((pi *2)* t)|31:y = 150 + R * sin (-(pi *2)* t)|27:%3 + %2 * cos ((pi *2)* %1)|
DataCount=3
MathStr="%3 + %2 * sin(-%1)"
link(X2,9867155:Var3,[(391,215)])
link(X3,11880627:Var3,[(398,222)])
}
Add(Hub,8911218,301,259)
{
OutCount=4
link(onEvent1,14307840:doCalc,[])
link(onEvent2,16095580:doCalc,[(349,272)(349,265)])
link(onEvent3,10043336:doNext,[(327,279)(327,244)(233,244)(233,209)])
link(onEvent4,10361775:doDraw,[(385,286)(385,321)])
}
Add(Memory,13135093,315,168)
{
@Hint=#6:Radius|
Default=Integer(150)
}
Add(Memory,7855591,357,168)
{
@Hint=#6:Centre|
Default=Integer(240)
}
Add(GetDataEx,9867155,315,210)
{
link(Data,13135093:Value,[])
}
Add(GetDataEx,11880627,357,217)
{
link(Data,7855591:Value,[])
}
Add(CounterEx,15911703,245,322)
{
Max=359
Point(doReset)
Point(onThroughMax)
link(onNext,8911218:doEvent1,[(289,328)(289,265)])
link(onThroughMax,10043336:doReset,[(289,335)(289,275)(233,275)(233,216)])
}