看了 知乎 上这个主题 如何用C语言画一个“心形”?(
http://www.zhihu.com/question/20187195),我觉得很有意思作为abandonware专家 我自然也弄了一个 实现了微积分书上那个最简单的笛卡尔心形
用的是WordBasic,Word for Windows 1.0-7.0时期Word支持的脚本语言,8.0之后被基于VB5的VBA取代。
使用了Win16的API,在32位的Word 6.0或者7.0上跑要自己修改。。
'API函数声明
Declare Function GetFocus Lib "user"() As Integer
Declare Function GetDC Lib "user"(hwnd As Integer) As Integer
Declare Function ReleaseDC Lib "user"(hwnd As Integer, hdc As Integer) As Integer
Declare Function MoveTo Lib "gdi"(hdc As Integer, x As Integer, y As Integer) As Integer
Declare Function LineTo Lib "gdi"(hdc As Integer, x As Integer, y As Integer) As Integer
Declare Function SetPixel Lib "gdi"(hdc As Integer, x As Integer, y As Integer, color As Long) As
Integer
Declare Function FloodFill Lib "gdi"(hdc As Integer, x As Integer, y As Integer, rgb As Long) As
Integer
Declare Function CreatePen Lib "gdi"(style As Integer, width As Integer, rgb As Long) As Integer
Declare Function CreateSolidBrush Lib "gdi"(rgb As Long) As Integer
Declare Function CreateHatchBrush Lib "gdi"(type As Integer, rgb As Long) As Integer
Declare Function SelectObject Lib "gdi"(hdc As Integer, hobj As Integer) As Integer
Declare Function DeleteObject Lib "gdi"(hobj As Integer) As Integer
'因为WordBasic没有数学库,就自己写了个简单的泰勒展开sin和cos,但是在这个环境下实在太慢了
Function tsin(x)
a = 1 : b = 1 : i = 1 : s = 0
a = x
tl:
s = s +(a / b)
a = - 1 * a * x * x
b = b * 2 * i *(2 * i + 1)
i = i + 1
If a / b >= 0.005 Or a / b <= - 0.005 Then Goto tl
tsin = s
End Function
Function tcos(x)
s = 1 : t = 1 : f = 1 : v = 1 : i = 2
While t > 0.005 Or t < - 0.005
f = f *(- 1 * x * x)
v = v *((i - 1) * i)
i = i + 2
t = f / v
s = s + t
Wend
tcos = s
End Function
Sub MAIN
hw = getfocus
hd = getdc(hw)
hp = createpen(0, 6, 255 * 65536)
hpo = selectobject(hd, hp)
'生成笛卡尔心形线
r = moveto(hd, 200 + 50 *(2 * tsin(0) - tsin(0)), 100 - 50 *(2 * tcos(0) - tcos(0)))
For i = 1 To 314
ty = 100 - 50 *(2 * tcos(i / 50) - tcos(i / 25))
tx = 200 + 50 *(2 * tsin(i / 50) - tsin(i / 25))
'Print Str$(tx) + " " + Str$(ty)
r = lineto(hd, tx, ty)
Next
hbr = createhatchbrush(5, 224 * 65536 + 64 * 256 + 64)
hobr = selectobject(hd, hbr)
r = floodfill(hd, tx, ty + 8, 255 * 65536)
r = selectobject(hd, hobr)
r = selectobject(hd, hpo)
r = deleteobject(hp)
r = deleteobject(hbr)
r = releasedc(0, hd)
End Sub
运行截图x2
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.