闲来无事,使用AHK做了一个用系统画图自动绘制各种等长多边形或多角形的案例,案例是做了,但没想出来哪里能用的到,正好国庆节,可以画个国旗出来,完全按照官方国旗画法自动绘制,顺便来个迟来的国庆祝福
国旗比例示意图
#NoEnv
;@Ahk2Exe-SetCopyright Creat By J&K_zh
gui,font,s16,微软雅黑
Gui, Add, Text,x20,若要画多边形或多角形请填写以下参数
Gui, Add, Radio,x100 v边,多边形
Gui, Add, Radio,x+20 v角 Checked,多角形
Gui, Add, Text,x100,边或角的数量
Gui, Add, Edit,x+20 v数量 w50,6
Gui, Add, Text,x37,中心到任意角的长度
Gui, Add, Edit,x+20 v半径长度 w70,100
Gui, Add, Text,x+20,像素
Gui, Add, Text,x100,初始旋转角度
Gui, Add, Edit,x+20 v角度 w70,0
Gui, Add, Text,x+20,度
Gui, Add, Button,x20 w368,画多边形或多角形
Gui, Add, Text,x50,若要画五星红旗请填写以下参数
Gui, Add, Text,x47,五星红旗的宽度
Gui, Add, Edit,x+20 v红旗宽度 w70,1000
Gui, Add, Text,x+20,像素
if !FileExist(A_ScriptDir . "\国旗比例示意图.jpg")
FileInstall,国旗比例示意图.jpg,%A_ScriptDir%\国旗比例示意图.jpg
Gui, Add, Picture,x20 w368 h-1,%A_ScriptDir%\国旗比例示意图.jpg
Gui, Add, Button,x20 w368,画五星红旗
gui,show,,选择要执行的动作 by J&K_zh
return
Button画多边形或多角形:
Gui,Submit,NoHide
s:="边"
if (角==1)
s:="角"
画等边对称图形(数量,s,10,角度,半径长度)
Return
Button画五星红旗:
Gui,Submit,NoHide
画国旗(红旗宽度)
Return
画国旗(国旗宽度)
{
国旗宽度:=abs(国旗宽度)
if (国旗宽度<100||国旗宽度>1300)
显示错误信息("国旗宽度的大小应介于100至1300之间")
段长:=国旗宽度/2/15
国旗高度:=国旗宽度/3*2
坐标原点:={"x":27,"y":185}
打开画图程序并设定画布()
切换颜色("红")
画矩形(坐标原点,国旗宽度,国旗高度)
填充颜色(坐标原点.x+5,坐标原点.y+5)
切换颜色("黄")
;最大的五角星
画五角星并填充(36,段长*3,round(坐标原点.x+段长*5),round(坐标原点.y+段长*5))
;第一颗小五角星
画五角星并填充(6,段长,round(坐标原点.x+段长*10),round(坐标原点.y+段长*2))
;第二颗小五角星
画五角星并填充(52,段长,round(坐标原点.x+段长*12),round(坐标原点.y+段长*4))
;第三颗小五角星
画五角星并填充(30,段长,round(坐标原点.x+段长*12),round(坐标原点.y+段长*7))
;第四颗小五角星
画五角星并填充(6,段长,round(坐标原点.x+段长*10),round(坐标原点.y+段长*9))
send !ht
sleep 200
x:=round(坐标原点.x+段长*10)
y:=round(坐标原点.y+段长*15)
Click,%x%,%y%
sleep 200
send 2022国庆快乐
}
画五角星并填充(初始角度,半径,x,y)
{
切换最细画笔()
画等边对称图形(5,"角",10,初始角度,半径,x,y)
tmp:=求等分圆点坐标(半径/2,5,x,y,初始角度)
for k,v in tmp
填充颜色(v[1],v[2])
填充颜色(x,y)
}
切换颜色(颜色)
{
颜色表格:={"红":[4,0],"黄":[4,1]}
if !颜色表格.HasKey(颜色)
显示错误信息("当前颜色【" . 颜色 . "】未定义")
send !hec
WinWaitActive,编辑颜色
sleep 200
send {Down 5}
sleep 100
send {Left 7}
sleep 100
tmp:=颜色表格[颜色]
loop,% tmp[1]
{
send {Up}
sleep 100
}
loop,% tmp[2]
{
send {Right}
sleep 100
}
send {Space}
sleep 100
send {Enter}
sleep 200
}
填充颜色(x,y)
{
send !hk
sleep 200
Click,%x%,%y%
sleep 200
}
画矩形(起点,长边,短边)
{
切换最细画笔()
CoordMode,Mouse
x:=起点.x
y:=起点.y
Click,%x%,%y%,Down
sleep 200
x:=x+长边
Click,%x%,%y%,Down
sleep 200
y:=y+短边
Click,%x%,%y%,Down
sleep 200
x:=起点.x
Click,%x%,%y%,Down
sleep 200
x:=起点.x
y:=起点.y
Click,%x%,%y%,Down
sleep 200
click,Up
}
切换最细画笔()
{
send !hp1
sleep 200
send {Enter}
sleep 200
}
画等边对称图形(数量:=5,多边形或多角形:="角",速度:=10,初始角度:=0,半径长度:=100,x:="",y:="")
{
;msgbox 半径长度:%半径长度%|x:%x%|y:%y%
;如果直接调用不带参数的函数"画等边对称图形()",将默认画一个五角星,默认的五角星尖朝下,想要改为朝上,只需要设定初始角度为36度(360/5/2)
初始角度:=abs(初始角度)
半径长度:=abs(半径长度)
数量:=abs(数量)
速度:=abs(速度)
;参数检查
s:=多边形或多角形!="角"?"边":"角"
if (数量==""||数量!=Round(数量)||数量<3||数量>100)
显示错误信息("多" . s . "形的" . s . "数量只能为3至100之间的整数`r`n小于3无法画出多" . s . "形,大于100无法看出效果(接近圆形)")
if (速度==""||速度<1||速度>10)
显示错误信息("速度只能为1至10之间的数字,可以为小数")
if (初始角度=="")
显示错误信息("初始角度必须为数字,可以为小数")
if (半径长度==""||半径长度<10||半径长度>A_ScreenHeight/2-30)
显示错误信息("半径长度必须为数字")
;速度的数字越大,画图速度就越快
延时:=(11-速度)*100
x:=Round(abs(x))
y:=Round(abs(y))
if (x==0)
x:=A_ScreenWidth/2
if (y==0)
y:=A_ScreenHeight/2
;msgbox 半径长度:%半径长度%|x:%x%|y:%y%
tmp:=求等分圆点坐标(半径长度,数量,x,y,初始角度)
tmp.Push(tmp[1])
if (s=="角")
多边形转多角形(tmp)
if !WinExist("无标题 - 画图")
打开画图程序并设定画布()
Else
WinActivate
CoordMode,Mouse
loop,% tmp.Count()
{
x:=tmp[A_Index][1]
y:=tmp[A_Index][2]
Click,%x%,%y%,Down
if (s=="角"&&mod(数量,2)==0&&A_Index==tmp.Count()/2)
Click,Up
sleep %延时%
}
click,Up
}
求等分圆点坐标(半径,等分数量,x,y,初始角度)
{
坐标数组:=[]
pi:=3.141592654
弧度:=(pi/180)*Round(360/等分数量)
if (初始角度>0)
初始弧度:=(pi/180)*初始角度+弧度
else
初始弧度:=0
loop,%等分数量%
{
tmp:=[]
tmp.Push(Round(x+半径*Sin(初始弧度+弧度*A_Index)))
tmp.Push(Round(y+半径*Cos(初始弧度+弧度*A_Index)))
坐标数组.Push(tmp)
}
Return 坐标数组
}
多边形转多角形(ByRef 数组)
{
if (mod(数组.Count(),2)!=0) ;单数
数组.Push(数组[2])
max:=Round(数组.Count()/2)
tmp:=[]
loop,%max%
tmp.Push(数组.RemoveAt(A_Index))
for k,v in 数组
tmp.Push(数组[A_Index])
数组:=tmp
}
打开画图程序并设定画布()
{
run,mspaint,Max
WinWaitActive,无标题 - 画图
WinMaximize
sleep 1000
PostMessage, 0x50,, 0x8040804,, A
send {Alt}
sleep 200
send h
sleep 200
send r
sleep 200
send e
sleep 200
WinWaitActive,调整大小和扭曲
sleep 200
send {Right}
sleep 200
send {Tab}
sleep 200
send %A_ScreenWidth%
sleep 200
send {Tab}
sleep 200
send {Tab}
sleep 200
send m
sleep 200
send {Up}
sleep 200
send %A_ScreenHeigh%
sleep 200
send {Enter}
sleep 200
}
显示错误信息(错误信息)
{
msgbox %错误信息%
ExitApp
}
GuiClose:
exitapp
另外,为啥我不能上传视频
用gdi绘制更好
用GDI当然画的更好,但我需要的不是某种图片,我的想法是计算出各个坐标位置,让鼠标来画,我们可以在画图里画,也可以在PS里画,或者任何可以使用鼠标手动画图的软件,国旗只是一个例子,实际上只要是规则的几何多角形都可以画