Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
1

Кардиоида в ассемблере

15.12.2013, 11:46. Показов 814. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте . Есть такая задача: нужно , чтобы курсор на экране рисовал кардиоиду
(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.
Но я не пойму , как их выразить , чему они равны в декартовой системе координат ?
Пожалуйста , помогите , с этим вопросом . Заранее огромное спасибо!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2013, 11:46
Ответы с готовыми решениями:

Кардиоида
Помогите пожалуйста! Построение кардиоиды. Функция задана параметрически: ...

Кардиоида
помогите, плз ='(( на этой неделе нужно сдать лабу( Построить график функции. Кардиоида. ...

Кардиоида
Напишете код в паскаль =* :gwink: Построить кривые по заданному параметрическому представлению или...

кардиоида
Помогите найти площадь, ограниченную кривыми: кардиоида r=1-cos\varphi и r=1

1
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
15.12.2013, 17:17 2
Коэффициенты выставь
quarter = 0.25;
half = 0.5;

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
   finit
  fld x
  fld quarter
  fsubp                ; st(0) <- (x - 0.25)
  fld st(0)            ; Дублируем (x - 0.25), оно еще пригодится
  fmul st(0), st(0)    ; st(0) <- (x - 0.25)^2
  fld y
  fmul st(0), st(0)    ; st(0) <- y^2
  faddp                ; st(0) <- y^2 + (x - 0.25)^2
  fsqrt                ; st(0) <- sqrt(y^2 + (x - 0.25)^2)
  ; Здесь в st(1) должно быть ранее продублированное (x - 0.25)
 
  fstp ro              ; сохраняем вычисленное значение ro
  fld y
  fxch                 ; st(1) <- y; st(0) <- (x - 0.25)
  fpatan               ; st(0) <- atan2(y / (x - 0.25)), то есть teta
  fcos                 ; st(0) <- cos(teta)
  fld half             ; st(0) <- 0.5; st(1) <- cos(teta)
  fmul st(1), st(0)    ; st(0) <- 0.5; st(1) <- 0.5*cos(teta)
  fxch                 ; st(0) <- 0.5*cos(teta); st(1) <- 0.5
  fsubp                ; st(0) <- 0.5 - 0.5 * cos(teta), то есть roC
 
  ; теперь надо сравнить значения ro и roC
  fld ro
  fcomip st(0), st(1) ; сравним эти 2 значения, и по флагам посмотрим результат
  jc @@go_true        ; если st(0) меньше, чем st(1)
  jz @@go_true        ; или st(0) равно st(1), то уходим на метку @@go_true
 
  ; если мы тут - значит st(0) > st(1)
  ; сохраняем в Result значение False
  mov Result, False
  jmp @@exit          ; и идем на выход
 
  @@go_true:
  mov Result, True
  ;сохраняем в Result значение True
  @@exit:
  ;все, концерт окончен, уходим из подпрограммы
Ток извиняюсь, эта версия была заточена под паскаль, но как-то так...
0
15.12.2013, 17:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2013, 17:17
Помогаю со студенческими работами здесь

Кардиоида
Построить кривые по заданному параметрическому представлению Кардиоида (рис. 59): x = a cos...

Кардиоида
Написала программу для построения кардиоиды но она почему-то не работает program cardioid;...

ДН кардиоида
ДН(диаграмма направленности).Подскажите с построением кардиоиды в 3д.

Кардиоида
Добрый день! Помогите пожалуйста исправить прогу, у меня рисунок не рисует точками(незнаю как ими...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru