我必须画一个图形y = cos(x2+x+1) interval: [-π/2,π/2]
。我有一个没有间隔的图形,只是用屏幕分辨率320 x 200进行计算。
这是我目前的代码:
;------------------------------------------------------------------------
%include 'yasmmac.inc'
org 100h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .text ; code starts here
startas:
call procSetGraphicsMode
xor di, di ; Y
.vertical:
mov si, 160 ; X
mov cl, 15 ; Color
call procPutPixel
inc di
cmp di, 199 ; MaxY
jbe .vertical
xor si, si ; X
.horizontal:
mov di, 100 ; Y
mov cl, 15 ; Color
call procPutPixel
inc si
cmp si, 319 ; MaxX
jbe .horizontal
; y = di
; x = si
mov si, 320
mov di, 100
xor si, si ; X
fninit
fld1 ; CONST 1
.loop:
mov [valueX], si ; X
fild word [valueX] ; st0 = X
fmul st0 ; st0 = X^2
fiadd word [valueX] ; st0 = X^2 + X
fadd st0, st1 ; st0 = X^2 + X + 1
fcos ; st0 = cos(X^2 + X + 1) [-1,+1]
fimul word [scaleY]
fistp word [y] ; {-1,0,+1}
mov di, 100 ; Y
add di, [y] ; -> Y={99,100,101}
mov cl, 4 ; Color
call procPutPixel
inc si
cmp si, 319
jbe .loop
call procWaitForEsc
exit
%include 'yasmlib.asm'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .data ; data
R:
dd 50.0
value1:
dd 0.0
value2:
dd 0.0
value3:
dd 1.0
valueX:
dw 0
scaleY:
dw 60
x:
dw 0
y:
dw 0
N:
dw 360
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .bss
此代码段绘制一个坐标平面和图形,不在给定的间隔内[-π/2,π/2]
. x1c 0d1x
我想让程序在区间[-π/2,π/2]
内画出这个区间,看起来像这样:
我需要以某种方式缩放我的X,使图形将在区间内。
我想让X的起点在中心(160),但我无法想象,如何移动到两边(负-朝向-π/2和正-朝向π/2)。我试图解释清楚,我可以。
如果需要更多信息,我将尝试编辑问题。
1条答案
按热度按时间xj3cbfub1#
图形
y = cos(x2+x+1)
我现在糊涂了:你想画的是
cos(x2 + x + 1)
还是cos(x^2 + x + 1)
?link in your previous question(不是问题中的文本)和这个问题中的图片显示的是前者,但我当时和现在的答案是关于后者的。x^2 + x + 1
的一个例子是x2 + x + 1
很快就会被写成3x + 1
。我已经包括了一个图片,它将图形限制为一个矩形,该矩形的宽度为289像素,高度为181像素。
由于矩形位于屏幕中央,因此其X坐标的范围为16到304,Y坐标的范围为10到190。
因为X=0位于X轴的中间,所以物理范围[16,304]对应于逻辑范围[-144,+144]。您要求-144与-π/2对齐,+144与+π/2对齐。三法则可以帮助您:
因此,(π/288)将是应用于所有逻辑X的因子,你可以输入代码。
为了便于验证,我添加了黄色的余弦图,这是我多年来在处理图形形状不明显的表达式时学到的技巧。