Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
1

В графическом режиме начиная с центра рисует две спирали (по часовой и против), в точках пересечения которых рисует окружность заданного радиуса

26.05.2013, 20:12. Просмотров 2965. Ответов 21
Метки нет (Все метки)


Написать программу, которая в графическом режиме начиная с центра рисует две спирали (по часовой и против) цвет которых чередуется от 1 до 255, в точках пересечения которых рисует окружность заданного радиуса и цвета.
Буду рад любой помощи
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2013, 20:12
Ответы с готовыми решениями:

Массив A[2*n+1][2*n+1] заполнить по спирали против часовой стрелки, начиная из центра
Можете пожалуйста помочь, я должен решить задачки и вот одна из них: Дано число n. Создайте...

Вывести элементы матрицы, начиная из центра и против часовой стрелки, начиная идти направо
Вывести элементы матрицы, начиная из центра и против часовой стрелки, начиная идти направо. Не...

Матрица по спирали, по часовой или против часовой, с левого верхнего угла, правого нижнего или из центра
Матрица по спирали, по часовой или против часовой, с левого верхнего угла, правого нижнего или из...

Записать текст матрицы от ее центра по спирали против часовой стрелки
Задача записать текст квадратной матрицы размера n(n-нечетное) от центра матрицы по спирали против...

__________________
Помогаю в написании студенческих работ здесь.
21
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
27.05.2013, 04:08 2
FasD,
это для DOS или для Windows? И если для DOS, то какой режим у вас там считается "графическим"? Там их туева хуча... Конкретизируй
Да, и найди формулы для своих спиралей и создай, то что ты хочешь получить в Маткаде или Матлабе. Формулы и тексты из маткада или матлаба опубликуй здесь
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
27.05.2013, 08:26  [ТС] 3
да, по ДОС.
Вот именно, что перерыл весь интернет, а толком ничего хорошего не нашел
есть такое, рисует только спираль
но здесь как рисует не понятно, с этим сопроцессором
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
include pixels.inc ;содержит макросы вывода точки
 
.model small
.stack 100h
.data
alpha dd 0.0 ;изменяющаяся переменная 
delta dd 0.001 ;величина изменения
xdiv2 dd 320.0 ;середина по X и Y
ydiv2 dd 240.0
tmp dd 0 ;temp
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr dw 0
 
.code
.486
start:
mov ax,@DATA
mov ds,ax
xor ax,ax
mov cx,9470h ;количество итераций цикла - 5*Pi/0.001
;------------------------------------------------------------------
mov ah,13h; ;инициализация графического режима 
mov al,12h
int 10h
;------------------------------------------------------------------
 
finit ;инициализация сопроцессора
 
l1:
 fld alpha        ;тут все просто
 fcos             ;ф-лы x=round(alpha*DivK*cos(alpha))
 fld alpha        ;y=round(alpha*DivK*sin(alpha))
 fmul divK
 fmul              
 frndint           
 fld xdiv2         
 fadd              
 fistp word ptr xr ;заносим X в переменную для вывода на экран
 
 fld alpha        
 fsin              
 fld alpha            
 fmul divK
 fmul              
 frndint           
 fstp tmp          
 fld ydiv2         
 fsub tmp          
 fistp word ptr yr ;заносим Y в переменную для вывода на экран
 
 PutPixel xr,yr,3ah ;выводим точку зеленым цветом
 
 fld delta ;вычисляем новое значение alpha
 fld alpha
 fadd
 fstp alpha
loop l1 ;цикл по cx
;--------------------------------------------------------------------
mov ah,1h ;ожидание нажатия клавиши 
int 21h
;--------------------------------------------------------------------
mov ah,0h ;перевод обратно в TextMode
mov al,03h
int 10h
;--------------------------------------------------------------------
exit:
mov ax,4C00h ;стандартный выход
int 21h
END start
файл .inc
Assembler
1
2
3
4
5
6
7
8
9
10
11
;макрос вывода пиксела на экран с коорд. x,y и цветом color
PutPixel macro x,y,color 
pusha
mov ah,0ch
mov al,color
mov bh,0h
mov cx,x
mov dx,y
int 10h
popa
endm
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
27.05.2013, 08:36 4
FasD,
а как ты спирали и круги собрался рисовать без сопроцессора? Графический то режим какой? И формулы давай спиралей и кругов, внимательно перечитай мои вопросы в сообщении #2, меня интересуют не фрагменты программ, а четкая постановка задачи и ее математическое решение
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
27.05.2013, 16:39  [ТС] 5
графический режим:13h
разрешение:320x200
кол-во цветов:256
R²=x²+y², где R радиус окружности
Архимедова спираль http://ru.wikipedia.org/wiki/%... 0%BB%D1%8C
не умею я маткаде такое строить
сделал картинкой
только у спирали цвет чередуется от 1 до 255
0
Миниатюры
В графическом режиме начиная с центра рисует две спирали (по часовой и против), в точках пересечения которых рисует окружность заданного радиуса  
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
27.05.2013, 16:43 6
FasD,
а ты попытайся, облегчи мне задачу... Согласись, что мне будет на много труднее шариться по интернетам, а потом писать для тебя программу, да еще и "комментировать каждую строку"
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
27.05.2013, 16:45  [ТС] 7
нету, к сожалению, у меня таких знаний маткада, и тем более матлаба
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
27.05.2013, 16:53  [ТС] 8
понимание состоит в том, чтобы я это нарисовал в маткаде?
я сейчас пытаюсь это сделать, надеюсь понимание мы найдем
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
27.05.2013, 17:42 9
FasD,
надеюсь, что ты понимаешь, что делаешь это не ради меня, а ради себя. Задача поставлена ТЕБЕ, не нужно делать одолжения...
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
27.05.2013, 20:39  [ТС] 10
Цитата Сообщение от Mikl___ Посмотреть сообщение
FasD,
надеюсь, что ты понимаешь, что делаешь это не ради меня, а ради себя. Задача поставлена ТЕБЕ, не нужно делать одолжения...
сделал
0
Вложения
Тип файла: 7z 1.7z (13.4 Кб, 9 просмотров)
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
28.05.2013, 05:51 11
FasD,
теперь мой ход, возьмем 12h графический режим (640х480х16 цветов) разрешение больше, цвета пока значение не имеют, беру программу которую ты привел, упрощаю ее, программа, которая выводит спираль по часовой стрелке
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
; masm dos exe #
.model small
.data
delta dd 0.001 ;величина изменения
xdiv2 dd 320.0 ;середина по X и Y
ydiv2 dd 240.0
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr dw 0 
.code
.486
PutPixel macro x,y,color 
    pusha
    mov ax,0C00h+color
    mov bh,0h
    mov cx,x
    mov dx,y
    int 10h
    popa
endm
start:  mov ax,@data
    mov ds,ax
    mov cx,9470h ;количество итераций цикла - 5*Pi/0.001
;------------------------------------------------------------------
    mov ax,12h   ;инициализация графического режима 
    int 10h
;------------------------------------------------------------------
    finit ;инициализация сопроцессора 
    fldz
l1: fld st;alpha        ;тут все просто
    fld st
    fsincos             ;ф-лы x=round(alpha*DivK*cos(alpha))
    fmul divK
    fmul st,st(2)
    fadd xdiv2
    fistp word ptr xr ;заносим Х в переменную для вывода на экран 
    fmul divK
    fmul
    fchs              
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr ;заносим Y в переменную для вывода на экран 
    PutPixel xr,yr,3Ah ;выводим точку зеленым цветом 
    fadd delta;вычисляем новое значение alpha
    loop l1 ;цикл по cx
;--------------------------------------------------------------------
    mov ah,0 ;ожидание нажатия клавиши 
    int 16h
;--------------------------------------------------------------------
    mov ax,3 ;перевод обратно в TextMode
    int 10h
;--------------------------------------------------------------------
exit:   mov ah,4Ch ;стандартный выход
    int 21h
end start
против часовой
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
; masm dos exe #
.model small
.data
delta dd 0.001 ;величина изменения
xdiv2 dd 320.0 ;середина по X и Y
ydiv2 dd 240.0
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr dw 0 
.code
.486
PutPixel macro x,y,color 
    pusha
    mov ax,0C00h+color
    mov bh,0h
    mov cx,x
    mov dx,y
    int 10h
    popa
endm
start:  mov ax,@data
    mov ds,ax
    mov cx,9470h ;количество итераций цикла - 5*Pi/0.001
;------------------------------------------------------------------
    mov ax,12h   ;инициализация графического режима 
    int 10h
;------------------------------------------------------------------
    finit ;инициализация сопроцессора 
    fldz
l1: fld st;alpha        ;тут все просто
    fld st
    fsincos             ;ф-лы x=round(alpha*DivK*cos(alpha))
    fmul divK
    fmul st,st(2)
    fadd xdiv2
    fistp word ptr xr ;заносим Х в переменную для вывода на экран 
    fmul divK
    fmul
;   fchs              
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr ;заносим Y в переменную для вывода на экран 
    PutPixel xr,yr,3Ah ;выводим точку зеленым цветом 
    fadd delta;вычисляем новое значение alpha
    loop l1 ;цикл по cx
;--------------------------------------------------------------------
    mov ah,0 ;ожидание нажатия клавиши 
    int 16h
;--------------------------------------------------------------------
    mov ax,3 ;перевод обратно в TextMode
    int 10h
;--------------------------------------------------------------------
exit:   mov ah,4Ch ;стандартный выход
    int 21h
end start
и, наконец, (барабанная дробь) выводим две спирали одновременно
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
; masm dos exe #
.model small
.data
delta dd 0.001 ;величина изменения
xdiv2 dd 320.0 ;середина по X и Y
ydiv2 dd 240.0
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr1 dw 0 
yr2 dw 0 
.code
.486
PutPixel macro x,y,color 
    pusha
    mov ax,0C00h+color
    mov bh,0h
    mov cx,x
    mov dx,y
    int 10h
    popa
endm
start:  mov ax,@data
    mov ds,ax
    mov cx,0C470h ;увеличим количество итераций цикла 
;------------------------------------------------------------------
    mov ax,12h   ;инициализация графического режима 
    int 10h
;------------------------------------------------------------------
    finit ;инициализация сопроцессора 
    fldz
l1: fld st;alpha        ;тут все просто
    fld st
    fsincos             ;ф-лы x=round(alpha*DivK*cos(alpha))
    fmul divK
    fmul st,st(2)
    fadd xdiv2
    fistp word ptr xr ;заносим X в переменную для вывода на экран 
    fmul divK
    fmul
    fld st
    fchs              
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr1 ;заносим Y1 в переменную для вывода на экран 
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr2 ;заносим Y2 в переменную для вывода на экран 
    PutPixel xr,yr1,3Bh ;выводим точку зеленым цветом 
    PutPixel xr,yr2,3Ah ;выводим точку синим цветом 
    fadd delta;вычисляем новое значение alpha
    loop l1 ;цикл по cx
;--------------------------------------------------------------------
    mov ah,0 ;ожидание нажатия клавиши 
    int 16h
;--------------------------------------------------------------------
    mov ax,3 ;перевод обратно в TextMode
    int 10h
;--------------------------------------------------------------------
exit:   mov ah,4Ch ;стандартный выход
    int 21h
end start
продолжение следует...
спрашивай, что непонятно
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
28.05.2013, 08:31  [ТС] 12
ок, буду разбираться и по ходу спрашивать)
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
28.05.2013, 09:46 13
следующий ход, на каждом шаге цвет спирали меняется
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
; masm dos exe #
.model small
.data
delta dd 0.001 ;величина изменения
xdiv2 dd 320.0 ;середина по X и Y
ydiv2 dd 240.0
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr1 dw 0 
yr2 dw 0 
color db 0
.code
.486
PutPixel macro x,y1,y2 
    push cx
    mov ah,0Ch
    mov al,color
    mov bh,0h
    mov cx,x
    mov dx,y1
    int 10h
    mov dx,y2
    int 10h
    inc color
    pop cx
endm
start:  mov ax,@data
    mov ds,ax
    mov cx,0C470h ;увеличим количество итераций цикла 
;------------------------------------------------------------------
    mov ax,12h   ;инициализация графического режима 
    int 10h
;------------------------------------------------------------------
    finit ;инициализация сопроцессора 
    fldz
l1: fld st;alpha        ;тут все просто
    fld st
    fsincos             ;ф-лы x=round(alpha*DivK*cos(alpha))
    fmul divK
    fmul st,st(2)
    fadd xdiv2
    fistp word ptr xr ;заносим X в переменную для вывода на экран 
    fmul divK
    fmul
    fld st
    fchs              
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr1 ;заносим Y в переменную для вывода на экран 
    fadd ydiv2        ;y=round(alpha*DivK*sin(alpha)) 
    fistp word ptr yr2 ;заносим Y в переменную для вывода на экран 
    PutPixel xr,yr1,yr2;выводим точку заданным цветом 
    fadd delta;вычисляем новое значение alpha
    loop l1 ;цикл по cx
;--------------------------------------------------------------------
    mov ah,0 ;ожидание нажатия клавиши 
    int 16h
;--------------------------------------------------------------------
    mov ax,3 ;перевод обратно в TextMode
    int 10h
;--------------------------------------------------------------------
exit:   mov ah,4Ch ;стандартный выход
    int 21h
end start
Спрашивай, мне надоедает пинать мяч в одни ворота
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
28.05.2013, 09:48  [ТС] 14
пока все понятно, просто надо погуглить эти функции сопроцессора
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
28.05.2013, 10:56 15
упрощаем и убыстряем
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
; masm dos exe #
.model small
.data
delta dd 0.001 ;величина изменения
divK dd 5.0 ;расстояние между дугами
xr dw 0 ;координаты выводимой точки
yr dw 0 
.code
.486
start:  mov ax,@data
    mov ds,ax
    mov cx,0C470h ;увеличим количество итераций цикла 
    mov ax,12h   ;инициализация графического режима 
    int 10h
;------------------------------------------------------------------
    finit ;инициализация сопроцессора 
    fldz
    mov ax,0C00h
    mov bh,0h
l1: fld st;alpha        ;тут все просто
    fld st
    fsincos             ;ф-лы x=round(alpha*DivK*cos(alpha))
    fmul divK
    fmul st,st(2)
    fistp word ptr xr ;заносим X в переменную для вывода на экран 
    fmul divK
    fmul
    fistp word ptr yr ;заносим Y в переменную для вывода на экран 
    push cx
    mov cx,xr
    add cx,320
    mov dx,yr
    add dx,240
    int 10h           ;выводим точку заданным цветом 
    sub dx,yr
    sub dx,yr
    int 10h           ;выводим точку заданным цветом 
    inc al
    pop cx
    fadd delta;вычисляем новое значение alpha
    loop l1 ;цикл по cx
;--------------------------------------------------------------------
    mov ah,0 ;ожидание нажатия клавиши 
    int 16h
    mov ax,3 ;перевод обратно в TextMode
    int 10h
exit:   mov ah,4Ch ;стандартный выход
    int 21h
end start
продолжение следует...
Ну, как нагуглил?
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
28.05.2013, 18:19  [ТС] 16
да, с сопроцессором разобрался, сча и функции стали понятны
только не могу понять вашу формулу спирали?
это? - x=round(alpha*DivK*cos(alpha))
fsincos - считает синиус и косинус одновременно? это как?
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
28.05.2013, 19:02 17
  1. а говоришь разобрался, да fsincos возвращает синус и косинус угла, как читай в справочнике
  2. формула спирали x=alpha*шаг_спирали*Cos(alpha) y=alpha*шаг_спирали*Sin(alpha)
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
28.05.2013, 21:09  [ТС] 18
ага, все, врубился)
0
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
29.05.2013, 08:54 19
FasD,
Написать программу, которая в графическом режиме
  1. начиная с центра рисует две спирали (по часовой и против)
    сделал
  2. цвет которых чередуется от 1 до 255,
    сделал
  3. в точках пересечения которых рисует окружность
    вопрос: как мы узнаем, что спирали пересеклись? как мы узнаем радиус окружности? Давай, шевели мозгом, напишешь -- буду писать дальше, нет -- до свидания!
0
1 / 1 / 0
Регистрация: 26.05.2013
Сообщений: 14
29.05.2013, 10:03  [ТС] 20
радиус сами задаем.
пересечение? также как и узнают пересечение 2 прямых, найдем общие точки
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2013, 10:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Написать программу на языке ассемблера, которая в графическом режиме рисует прямоугольник
Народ, пожалуйста помогите. Написать программу на языке ассемблера, которая в графическом режиме...

Заполнение матрицы по спирали, начиная с центральной клетки, против часовой стрелки
Никак не могу разобраться с чего начать. Помогите, пожалуйста. Дано число n. Создайте массив A и...

Заполнить массив спиралью начиная с центра и против часовой стрелки
14. Дано число n. Создайте матрицу int A и заполните её по спирали, начиная с числа 0 в центральной...

Работа с мышью: в графическом режиме рисует линии при нажатии кнопки и движении мышки
Осталось сдать последнюю лабу, но что-то никак. Находил похожие, но они на FASM. Вот прошу помощи...

Начиная с первого элемента и перемещаясь против часовой стрелки, вывести все элементы матрицы по спирали
Дана квадратная матрица A порядка M (M — нечетное число). Начиная с первого элемента и перемещаясь...

Подсчитать, сколько раз за нулем следует положительное число, если обходить таблицу по спирали против часовой стрелки, начиная с нижнего правого угла.
Пожалуйста помогите!:help: Задача: Подсчитать, сколько раз за нулем следует положительное...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.