|
Вопрос # 875/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Уважаемые, Эксперты! Пожалуйста, подскажите, как правильно/корректно соединить коды двух вариантов? Вариант №2 работает отлично и строит спираль Фермат, но мне нужна конструкция подобная варианту №1 (пока она строит спираль Архимеда, а мне нужны другие типы, например спираль Фермат, Галилея и другие). Как можно корректно модернизировать код ниже (Вариант №2) под конструкцию Варианта №1? Всем спасибо за практический совет!
Приложение: Переключить в обычный режим- Delphi 7, Win XP Pro SP2;
-
- procedure CreateSpiral(FWidth, FHeight : Integer; Rotangle : Double);
- var X, Y, Ox, Oy : Integer;
- Theta, Dist : Double;
- clr : Byte;
- temp : Double;
- begin
- // here there will be a centre!
- Ox := MulDiv(FWidth, 1, 2);
- Oy := MulDiv(FHeight, 1, 2);
- Theta := 0;
- for Y := 0 to Pred(FHeight) do
- begin
- for X := 0 to Pred(FWidth) do
- begin
- Dist := Sqrt(Sqr(X - Ox) + Sqr(Y - Oy));
- Theta := -ArcTan2(y - Oy, x - Ox) + Rotangle;
- temp := Theta + Dist;
- clr := 255*Sign(Sin(temp));
- if clr <> 255 then
-
- end;
- end;
- end;
-
- procedure TForm1.DrawSpiralFermat;
- var
- i, x, y, cx, cy, MaxR: Integer;
- a, theta, R: Double;
- begin
- a := 20;
- cx := 200;
- cy := 200;
- maxR := 200;
- i := 0;
- repeat
- theta := i * 0.2 /(2 * pi);
- R := a * Sqrt(theta);
- if R > MaxR then
- Break;
- x := cx + Round(R * Cos(theta));
- y := cy + Round(R * Sin(theta));
- Canvas.Pixels[x, y] := clBlack;
- Inc(i);
- until False;
- end;
 |
Вопрос задал: DrValor (статус: Посетитель)
Вопрос отправлен: 28 августа 2007, 01:03
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 16; последнее сообщение — 29 августа 2007, 18:58; участников в обсуждении: 3.
|
DrValor (статус: Посетитель), 28 августа 2007, 12:45 [#1]:
Доброе утро! Уважаемые эксперты, ну хоть строчку, которую надо изменить в Варинте №1 и как подскажите! Спасибо!
|
|
Вадим К (статус: Академик), 28 августа 2007, 13:01 [#2]:
А смысл соединять несоединимое? что вы хотите получить?
Не проще ли сделать две функции, которые всё строят, но вызывать их с Button1Click?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
DrValor (статус: Посетитель), 28 августа 2007, 15:31 [#3]:
Спасибо за ответ, тогда Вы можете подсказать как построить спираль Ферамат по аналогии с первой функцией. спасибо!
|
|
DrValor (статус: Посетитель), 28 августа 2007, 15:33 [#4]:
разве первый первый вариант нельзя изменить так чтобы он строил другие типы спиралей? Если можно то как - подскажите!
|
|
Вадим К (статус: Академик), 29 августа 2007, 00:48 [#5]:
перефразирую вопрос по другому, "Есть программа расчёта рисования квадрата, что нужно изменить, что бы рисовать круг?"
Дело в том, что не все спирали строятся по подобным алгоритмам. Для некоторых могут быть очень сложны алгоритмы.
Тоесть, нет универсального алгоритма.
Тоесть для каждой спирали прийдётся строить свой алгоритм. Хотя вполне может быть, что некоторые будут строиться по подобным.
Я не могу понять, что вы добиваетесь и что вас не устраивает в втором алгоритме?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 02:13 [#6]:
Спасибо! Я просил о помощи не ради развлечения. По профессии я научный сотрудник, медик и спирали мне необходимы для лечения больных детей. Это во-первых, во вторых по сути, я понимаю Вас, но второй вариант выводит спираль по отдельным пикселам, медленно, а первый выводит быстро и можно регулировать ширину листа (или листьев спирали). Поэтому я попросил совета как можно изменить первый алгоритм чтобы он рисовал спираль Фермат. Хорошо, нельзя так нельзя. А как можно переписать второй алгоритм с прорисовкой, напрмиер методом ScanLine? И можно было задавать размер (ширину) листьев (листа) спирали? Так вопрос корректен?
|
|
Вадим К (статус: Академик), 29 августа 2007, 13:04 [#7]:
Не знаю, каким боком эти спирали относятся к детям больным, но в новой формулировке он более понятен. Как ускорить - это можно. Как вариант - рисовать на отдельной канве. ScanLine здесь напрямую мало поможет- он подразумевает последовательный доступ.
Но я поднапряг свои мысли и розродился на быстрый вариант.
при значении параметра а = 20 я практически не получал ускорения, хотя даже на мой рабочей машине (2 процессора по 400 МГц) это было меньше десятой секунды. При значении параметра а = 5 ускорение достигало 6-8 раз.
Значит медлен и сам алгоритм расчёта, пришлось его "потрогать".
Первым долгом добавим модуль Math. Тут многие математические функции переписаны с оптимизацией и работают значительно быстрей.
Было выиграно ещё немного времени, но это уже так, мелочи. Ниже я привожу вариант "поправленной" второй функции
procedure TForm1.DrawSpiralFermat;
const w = 500;
h = 500;
var
i, x, y, cx, cy, MaxR: Integer;
a, theta, R: Extended;
s,c:extended;
bm:array of byte; //смысл заводить много памяти. нам же только чёрный/белый
bmp:TBitmap;//Будем переносить на битмап, а оттудова - куда угодно. Хоть в файл сохраняй, хоть на форму
l:^Byte;
t:cardinal;
const pivmin = 1/2/PI;
begin
t:=GetTickCount;
//выделим память
SetLength(bm,w*h);
FillMemory(@bm[0],w*h,255);//всё беленьким зальём
a := 10;
cx := 200;
cy := 200;
maxR := 200;
i := 0;
repeat
theta := i * 0.2 * pivmin;
R := a * Sqrt(theta);
if R > MaxR then
Break;
SinCos(theta,s,c);
x := cx + Round(R * c);
y := cy + Round(R * s);
//x := cx + Round(R * Cos(theta));
//y := cy + Round(R * Sin(theta));
//Canvas.Pixels[x, y] := clBlack;
bm[y*w+x] := 0;
Inc(i);
until False;
bmp:=TBitmap.Create;
bmp.Width:=w;
bmp.Height:=h;
bmp.PixelFormat:=pf8bit;//нам больше и не надо
//а теперь в цикле перенесём в битмап
for y:=0 to h-1 do
begin
l:=bmp.ScanLine[y];
for x:=0 to w-1 do
begin
l^:=bm[y*w+x];
inc(l);
end;
end;
Form1.Canvas.Draw(0,0,bmp);
bmp.free;
//Замер времени.
t:=GetTickCount-t;
Caption:=IntToStr(t);
end;
По поводу, где у этой спирали "листья" я не знаю. Гугл тоже молчит по поводу этого типа спиралей. единственное, что я нашёл - это менять параметр а.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 14:51 [#8]:
Спасибо за ответ!
1) Спирали применятются для психоэмоциональной коррекции при некоторых тяжелых наследственных и приобретенных патологиях в сочетании с традиционным лечением.
2) Я воспроизвел Ваш вариант, действительно спираль строится, но главная проблема все же остается.
а) Лист это собственно линия, которая строит спираль. Она ведь может быть не одна. Тк ведь? То есть от центра могул отходить 1, 2, 3 и так далее линии, которые будут строить спираль (по аналогии со спиралью Архимеда). Сейчас - эта линия (или лист) это точки на канве, а мне нужно вывести спираль с регулируемой шириной "линии". Основной фон, нарример белый, а сама "линия" спирали голубая. Так понятно?
б) в данном варианте если изменить PixelFormat на pf24bit рисунок спирали сильно искажается. Почему?
Спасибо еще раз за помощь.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 15:01 [#9]:
извините, небольшое дополнение, цвет спирали имеет очень большое значение в терапии, поэтому черно-белая спираль не годится. Нужна спираль поддерживающая как минимум 24бит. И ширина самой линии - регулируемая очень важна! Спасибо.
|
|
Вадим К (статус: Академик), 29 августа 2007, 15:05 [#10]:
>> Но проблемма остаётся
Значит я не понял вашу проблему. Я думал она в скорости...
изменить ширину линии можно рисуя отрезками. Но получиться немного рубанной, а не сглаженной. Можно конечно улучшить.
Хотя мне кажеться, что вы свою задачу маленькими пачками выдаёте. Очень сложно понять как вам хочеться. Вы как доктор должны понимать, что телепетия хоть и есть, но не все её могут в полной мере пользоваться.
>>в данном варианте если изменить PixelFormat на pf24bit рисунок спирали сильно искажается. Почему?
А почему если взять очки не на +1, а на +7, то картинка сильно исказиться?
здесь аналогично. Дело в том, что ScanLine даёт прямой доступ до памяти, где хранятся пиксели. в режиме pf8bit на одну точку отводиться 1 байт, в pf24bit - 3 байта. причём первый отвечает за синий, второй за зелёный и третий за красный(если не перепутал опять...)
По поводу "рисовать три/четыре спирали на одной" - это уже математика и к программированию имеет опосредсвенное отношение. программисты хоть и знают математику (без неё уж никак) но различные специализированные главы о фракталах - уж извольте. Хотя, у нас, на постсоветском пространстве программист - это мастер на все руки. он не только запрограммировать может, а и кабель сетевой проложит, и шпаклёвкой дырку в стене проложит после дырки для кабеля.
Программист - это как доктор. У нас тоже есть свои специализации.
Сорри, если резко. Формулируйте чётко ТЗ (Техническое задание) - получите чёткий ответ.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 15:15 [#11]:
Хорошо, лучше все же один раз увидеть, чем сто раз писать. Как я могу прислать Вам картинку того, как это должно выглядеть? Спасибо.
|
|
Вадим К (статус: Академик), 29 августа 2007, 16:00 [#12]:
Напрягая свой телепатический модуль, могу предположить, что там ещё и анимация понадобиться...
А это уже попахивает мутными вещами. Дело в том, что такими картинками можно не только лечить, а и калечить. И грань тонка. Изготавливать орудия калеченья я не хочу. Учитывая то, что вы я так понимаю эксперементируете - будьте предельно осторожно. Я попадался под такое "лечение" - хорошо, что я был в курсе что оно не только полезно, но и <вырезано цензурой>. А люди пострадали.
Но картинку присылайте, посмотрим. Но если я откажусь - знайте, я обяснял причины.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 16:09 [#13]:
Во-первых, как прислать? Объясните как это сделать практически. Во-вторых, посетите адрес (http://www.bio.brasileiro.ru/index.htm) и у Вас отпадут вся кие сомнения в моей некомпетентности. Это все равно, что я бы сейчас рассждал в Вашей профессиональной некомпетентности. Я не любитель, а ученый со степенью. И каждый мог шаг сто раз выверяется прежде чем я что-то использую. Я полагю что в данном вопросе можно поставить точку. Теперь о спирали - анимация да предполагается, но этот вопрос у Вам и к нашему обсуждению не имеет отношения. И его я Вам задавить не собирался и не буду. Речь только о построении спирали подобной той, которуя я хочу Вам показать. возможно для опытного программиста хватит одного взгляда чтобы изменить некоторый параметр добиться желаемого результата. Вы правы с незнакомыми посетителями так и надо (с осорожностью). Я не в обиде. Хотя по отношению ко-мне Вы абсолютно не правы. Я жду или электронный адрес или как еще можно загрузить маленькую картинку. Спасибо!
|
|
DrValor (статус: Посетитель), 29 августа 2007, 16:19 [#14]:
я послал Вам письмом картинку на адрес expert@delphi.int.ru. Спасибо.
|
|
DrValor (статус: Посетитель), 29 августа 2007, 16:22 [#15]:
небольшое дополнение: так выглядит спираль архимеда (в посланном файле), а мне нужны другие спирали, в данном случае фермат.
|
|
Ерёмин А.А. (статус: *Администратор), 29 августа 2007, 18:58 [#16]:
DrValor: expert@delphi.int.ru - администраторский ящик в рамках Delphi.int.ru Expert. Для передачи файлов лично другим участникам используйте другие способы (ftp, e-mail), а для связи - систему личных сообщений.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|