使用AHK绘制等长多边形或多角形,附国旗自动绘制案例

闲来无事,使用AHK做了一个用系统画图自动绘制各种等长多边形或多角形的案例,案例是做了,但没想出来哪里能用的到,正好国庆节,可以画个国旗出来,完全按照官方国旗画法自动绘制,顺便来个迟来的国庆祝福

国旗比例示意图

使用AHK绘制等长多边形或多角形,附国旗自动绘制案例


  1. #NoEnv
  2. ;@Ahk2Exe-SetCopyright Creat By J&K_zh
  3. gui,font,s16,微软雅黑
  4. Gui, Add, Text,x20,若要画多边形或多角形请填写以下参数
  5. Gui, Add, Radio,x100 v边,多边形
  6. Gui, Add, Radio,x+20 v Checked,多角形
  7. Gui, Add, Text,x100,边或角的数量
  8. Gui, Add, Edit,x+20 v数量 w50,6
  9. Gui, Add, Text,x37,中心到任意角的长度
  10. Gui, Add, Edit,x+20 v半径长度 w70,100
  11. Gui, Add, Text,x+20,像素
  12. Gui, Add, Text,x100,初始旋转角度
  13. Gui, Add, Edit,x+20 v角度 w70,0
  14. Gui, Add, Text,x+20,度
  15. Gui, Add, Button,x20 w368,画多边形或多角形
  16. Gui, Add, Text,x50,若要画五星红旗请填写以下参数
  17. Gui, Add, Text,x47,五星红旗的宽度
  18. Gui, Add, Edit,x+20 v红旗宽度 w70,1000
  19. Gui, Add, Text,x+20,像素
  20. if !FileExist(A_ScriptDir . "\国旗比例示意图.jpg")
  21. FileInstall,国旗比例示意图.jpg,%A_ScriptDir%\国旗比例示意图.jpg
  22. Gui, Add, Picture,x20 w368 h-1,%A_ScriptDir%\国旗比例示意图.jpg
  23. Gui, Add, Button,x20 w368,画五星红旗
  24. gui,show,,选择要执行的动作 by J&K_zh
  25. return
  26. Button画多边形或多角形:
  27. Gui,Submit,NoHide
  28. s:="边"
  29. if (角==1)
  30. s:="角"
  31. 画等边对称图形(数量,s,10,角度,半径长度)
  32. Return
  33. Button画五星红旗:
  34. Gui,Submit,NoHide
  35. 画国旗(红旗宽度)
  36. Return
  37. 画国旗(国旗宽度)
  38. {
  39. 国旗宽度:=abs(国旗宽度)
  40. if (国旗宽度<100||国旗宽度>1300)
  41. 显示错误信息("国旗宽度的大小应介于100至1300之间")
  42. 段长:=国旗宽度/2/15
  43. 国旗高度:=国旗宽度/3*2
  44. 坐标原点:={"x":27,"y":185}
  45. 打开画图程序并设定画布()
  46. 切换颜色("红")
  47. 画矩形(坐标原点,国旗宽度,国旗高度)
  48. 填充颜色(坐标原点.x+5,坐标原点.y+5)
  49. 切换颜色("黄")
  50. ;最大的五角星
  51. 画五角星并填充(36,段长*3,round(坐标原点.x+段长*5),round(坐标原点.y+段长*5))
  52. ;第一颗小五角星
  53. 画五角星并填充(6,段长,round(坐标原点.x+段长*10),round(坐标原点.y+段长*2))
  54. ;第二颗小五角星
  55. 画五角星并填充(52,段长,round(坐标原点.x+段长*12),round(坐标原点.y+段长*4))
  56. ;第三颗小五角星
  57. 画五角星并填充(30,段长,round(坐标原点.x+段长*12),round(坐标原点.y+段长*7))
  58. ;第四颗小五角星
  59. 画五角星并填充(6,段长,round(坐标原点.x+段长*10),round(坐标原点.y+段长*9))
  60. send !ht
  61. sleep 200
  62. x:=round(坐标原点.x+段长*10)
  63. y:=round(坐标原点.y+段长*15)
  64. Click,%x%,%y%
  65. sleep 200
  66. send 2022国庆快乐
  67. }
  68. 画五角星并填充(初始角度,半径,x,y)
  69. {
  70. 切换最细画笔()
  71. 画等边对称图形(5,"角",10,初始角度,半径,x,y)
  72. tmp:=求等分圆点坐标(半径/2,5,x,y,初始角度)
  73. for k,v in tmp
  74. 填充颜色(v[1],v[2])
  75. 填充颜色(x,y)
  76. }
  77. 切换颜色(颜色)
  78. {
  79. 颜色表格:={"红":[4,0],"黄":[4,1]}
  80. if !颜色表格.HasKey(颜色)
  81. 显示错误信息("当前颜色【" . 颜色 . "】未定义")
  82. send !hec
  83. WinWaitActive,编辑颜色
  84. sleep 200
  85. send {Down 5}
  86. sleep 100
  87. send {Left 7}
  88. sleep 100
  89. tmp:=颜色表格[颜色]
  90. loop,% tmp[1]
  91. {
  92. send {Up}
  93. sleep 100
  94. }
  95. loop,% tmp[2]
  96. {
  97. send {Right}
  98. sleep 100
  99. }
  100. send {Space}
  101. sleep 100
  102. send {Enter}
  103. sleep 200
  104. }
  105. 填充颜色(x,y)
  106. {
  107. send !hk
  108. sleep 200
  109. Click,%x%,%y%
  110. sleep 200
  111. }
  112. 画矩形(起点,长边,短边)
  113. {
  114. 切换最细画笔()
  115. CoordMode,Mouse
  116. x:=起点.x
  117. y:=起点.y
  118. Click,%x%,%y%,Down
  119. sleep 200
  120. x:=x+长边
  121. Click,%x%,%y%,Down
  122. sleep 200
  123. y:=y+短边
  124. Click,%x%,%y%,Down
  125. sleep 200
  126. x:=起点.x
  127. Click,%x%,%y%,Down
  128. sleep 200
  129. x:=起点.x
  130. y:=起点.y
  131. Click,%x%,%y%,Down
  132. sleep 200
  133. click,Up
  134. }
  135. 切换最细画笔()
  136. {
  137. send !hp1
  138. sleep 200
  139. send {Enter}
  140. sleep 200
  141. }
  142. 画等边对称图形(数量:=5,多边形或多角形:="角",速度:=10,初始角度:=0,半径长度:=100,x:="",y:="")
  143. {
  144. ;msgbox 半径长度:%半径长度%|x:%x%|y:%y%
  145. ;如果直接调用不带参数的函数"画等边对称图形()",将默认画一个五角星,默认的五角星尖朝下,想要改为朝上,只需要设定初始角度为36度(360/5/2)
  146. 初始角度:=abs(初始角度)
  147. 半径长度:=abs(半径长度)
  148. 数量:=abs(数量)
  149. 速度:=abs(速度)
  150. ;参数检查
  151. s:=多边形或多角形!="角"?"边":"角"
  152. if (数量==""||数量!=Round(数量)||数量<3||数量>100)
  153. 显示错误信息("多" . s . "形的" . s . "数量只能为3至100之间的整数`r`n小于3无法画出多" . s . "形,大于100无法看出效果(接近圆形)")
  154. if (速度==""||速度<1||速度>10)
  155. 显示错误信息("速度只能为1至10之间的数字,可以为小数")
  156. if (初始角度=="")
  157. 显示错误信息("初始角度必须为数字,可以为小数")
  158. if (半径长度==""||半径长度<10||半径长度>A_ScreenHeight/2-30)
  159. 显示错误信息("半径长度必须为数字")
  160. ;速度的数字越大,画图速度就越快
  161. 延时:=(11-速度)*100
  162. x:=Round(abs(x))
  163. y:=Round(abs(y))
  164. if (x==0)
  165. x:=A_ScreenWidth/2
  166. if (y==0)
  167. y:=A_ScreenHeight/2
  168. ;msgbox 半径长度:%半径长度%|x:%x%|y:%y%
  169. tmp:=求等分圆点坐标(半径长度,数量,x,y,初始角度)
  170. tmp.Push(tmp[1])
  171. if (s=="角")
  172. 多边形转多角形(tmp)
  173. if !WinExist("无标题 - 画图")
  174. 打开画图程序并设定画布()
  175. Else
  176. WinActivate
  177. CoordMode,Mouse
  178. loop,% tmp.Count()
  179. {
  180. x:=tmp[A_Index][1]
  181. y:=tmp[A_Index][2]
  182. Click,%x%,%y%,Down
  183. if (s=="角"&&mod(数量,2)==0&&A_Index==tmp.Count()/2)
  184. Click,Up
  185. sleep %延时%
  186. }
  187. click,Up
  188. }
  189. 求等分圆点坐标(半径,等分数量,x,y,初始角度)
  190. {
  191. 坐标数组:=[]
  192. pi:=3.141592654
  193. 弧度:=(pi/180)*Round(360/等分数量)
  194. if (初始角度>0)
  195. 初始弧度:=(pi/180)*初始角度+弧度
  196. else
  197. 初始弧度:=0
  198. loop,%等分数量%
  199. {
  200. tmp:=[]
  201. tmp.Push(Round(x+半径*Sin(初始弧度+弧度*A_Index)))
  202. tmp.Push(Round(y+半径*Cos(初始弧度+弧度*A_Index)))
  203. 坐标数组.Push(tmp)
  204. }
  205. Return 坐标数组
  206. }
  207. 多边形转多角形(ByRef 数组)
  208. {
  209. if (mod(数组.Count(),2)!=0) ;单数
  210. 数组.Push(数组[2])
  211. max:=Round(数组.Count()/2)
  212. tmp:=[]
  213. loop,%max%
  214. tmp.Push(数组.RemoveAt(A_Index))
  215. for k,v in 数组
  216. tmp.Push(数组[A_Index])
  217. 数组:=tmp
  218. }
  219. 打开画图程序并设定画布()
  220. {
  221. run,mspaint,Max
  222. WinWaitActive,无标题 - 画图
  223. WinMaximize
  224. sleep 1000
  225. PostMessage, 0x50,, 0x8040804,, A
  226. send {Alt}
  227. sleep 200
  228. send h
  229. sleep 200
  230. send r
  231. sleep 200
  232. send e
  233. sleep 200
  234. WinWaitActive,调整大小和扭曲
  235. sleep 200
  236. send {Right}
  237. sleep 200
  238. send {Tab}
  239. sleep 200
  240. send %A_ScreenWidth%
  241. sleep 200
  242. send {Tab}
  243. sleep 200
  244. send {Tab}
  245. sleep 200
  246. send m
  247. sleep 200
  248. send {Up}
  249. sleep 200
  250. send %A_ScreenHeigh%
  251. sleep 200
  252. send {Enter}
  253. sleep 200
  254. }
  255. 显示错误信息(错误信息)
  256. {
  257. msgbox %错误信息%
  258. ExitApp
  259. }
  260. GuiClose:
  261. exitapp

另外,为啥我不能上传视频

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
其他案例

excelio v1使用心得(1)

2022-9-26 19:21:55

案例

Autohotkey调用彩云小译 API实现全过程

2022-10-11 16:29:02

3 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
  1. 蜜獾哥

    用gdi绘制更好

    • 五分钟

      用GDI当然画的更好,但我需要的不是某种图片,我的想法是计算出各个坐标位置,让鼠标来画,我们可以在画图里画,也可以在PS里画,或者任何可以使用鼠标手动画图的软件,国旗只是一个例子,实际上只要是规则的几何多角形都可以画

  2. dbgba
    dbgba给您捐赠了¥2
个人中心
购物车
优惠劵
私信列表
搜索