Здравствуйте . Есть такая задача: нужно , чтобы курсор на экране рисовал кардиоиду
(
http://ru.wikipedia.org/wiki/%... 0%B4%D0%B0)
Есть пример такой задачи , только со Спиралью Архимеда:
Assembler |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| .686 ; директива визначення типу мікропроцесора
.model flat,stdcall ; завдання лінійної моделі пам’яті та угоди ОС Windows
option casemap:none ; відмінність малих та великих літер
include \masm32\include\windows.inc ; файли структур, констант …
include \masm32\macros\macros.asm
uselib user32, kernel32, fpu, gdi32
.data
hdc dd ?
colour dd 32000 ; початкове значення кольору (зелений)
mas dd 31415 ;6283 для одного витка ;12566 ; кількість витків (2рі)
two dd 2 ; для деления размера экрана на 2
alpha dd 0.0 ; кутова координата
delta dd 0.001 ; збільшення координати
xdiv2 dd ? ; середина по X
ydiv2 dd ? ; середина по Y
tmp dd 0 ; тимчасова змінна
;K1 dd 2.5 ; масштабні коефіцієнти
;K2 dd 5.0
;K3 dd 10.0
divK dd 10.0 ; масштабний коефіцієнт
xr dd 0 ; координати функції
yr dd 0
x dd ?
y dd ?
.code
_st:
invoke GetSystemMetrics,SM_CXSCREEN ; отримання ширина екрана в пікселях
mov x,eax
finit ; ініціювання співпроцесора
fild x ; st(0) = (ширина вікна)
fild two ; st(0) = 2
fdivp st(1), st ; st(0) = (ширина вікна)/2
fistp dword ptr xdiv2 ; збереження середини по X
invoke GetSystemMetrics,SM_CYSCREEN ; отримання висоти екрана в пікселях
mov y,eax
fild y ; st(0) = (висота вікна)
fild two ; st(0) = 2
fdivp st(1), st ; st(0) = (висота вікна)/2
fistp dword ptr ydiv2 ; збереження середини по Y
; рисування у середину вікна
mov ecx, mas ; визначення кількості циклів
push ecx ; збереження в стеку кількості циклів
l1:
fld alpha ; st(0) := alpha
fcos ; st(0) := cos(alpha)
fld alpha ; st(0) := alpha
fmul divK ; st(0) := alpha * divK, st(1) := cos(alpha)
fmul ; st(0) := st(0) * st(1) := alpha * divK * cos(alpha)
fild xdiv2
fadd ; xr := xdiv2 + alpha * divK * cos(alpha)
fistp dword ptr xr ; збереження X для виведення на екран
fld alpha ; st(0) := alpha
fsin ; st(0) := sin(alpha)
fld alpha ; st(0) := alpha
fmul divK ; st(0) := alpha * divK, st(1) := sin(alpha)
fmul ; st(0) := st(0) * st(1) := alpha * divK * cos(alpha)
fstp tmp
fild ydiv2
fsub tmp ; yr:= ydiv2 - alpha * divK * cos(alpha)
fistp dword ptr yr ; збереження X для виведення на екран
invoke SetPixel, hdc, xr, yr, colour ; рисування
invoke Sleep,1 ; затримка
invoke SetCursorPos,xr, yr ; встановлення курсора за координатами
fld delta ; збільшення кутової координати
fld alpha
fadd
fstp alpha
pop ecx ; повернення з стека кількості циклів
dec ecx ; зменшення лічильника
push ecx
jz l2 ; продовження рисування
jmp l1 ; вихід із циклу
l2: pop ecx
invoke ExitProcess, 0 ; повернення управління ОС та вивільнення ресурсів
end _st ; директива закінчення програми з ім’ям st |
|
В принципе, с примером почти всё понятно . Было дано, что :
x = x 0 + К φ cos φ;
y = y 0 + К φ sin φ;
xr := xdiv2 + alpha * divK * cos(alpha)
yr:= ydiv2 - alpha * divK * cos(alpha)
А вот с кардиоидой возникли проблемы: прочитал , что
В прямоугольных координатах:
(x^2 + y^2 + 2 a x)^2 - 4 a^2 (x^2 + y^2)=0
В прямоугольных координатах (параметрическая запись):
x = 2 a *cos t - a *cos 2 t
y = 2 a *sin t - a *sin 2 t
В полярных координатах:
r = 2a (1 + cos φ)
Не знаю , что и делать . По идее, мне также нужно задать x , y.
Но я не пойму , как их выразить , чему они равны в декартовой системе координат ?
Пожалуйста , помогите , с этим вопросом . Заранее огромное спасибо!!