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

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

国旗比例示意图

使用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

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

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

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
个人中心
购物车
优惠劵
有新私信 私信列表
搜索