用户:天上的流星_tianqiVirus查看:1 回复:1 评论:1 创建时间:2020-02-26T08:45:53
地图复制器重要功能
查找交点
之前我有写过一个喵的游戏
不过最近有一个众所周知的,有着强大感染力的东西给我带来了很多麻烦
所以这个游戏的教程就不得不停止了
...
不过这次,我要介绍的是我最近研究的地图复制功能
为什么要设计这个呢
就是说,当我看到了一个极具感染力的东西时,比如这个↓

我就会把它画下来(这个↑是纸质的)
这时就会出现很多问题
其中重要的一点就是如何找到构成地图的关键点
如果直接量xy坐标,会因垂直线问题而出现很多偏差
这时,我采用画圆法
找三个固定的点(以下叫做定位点),量出它们到关键点的距离,并分别做三个圆
三个圆的交点即为关键点
代码如下
from PIL import Image,ImageDraw
from math import sqrt
from json import load
with open("Hongkou-Yangpu.json") as f:
data = load(f)
w = 347
h = 346
img = Image.new("RGBA",(w,h))
dramap = ImageDraw.Draw(img)
def PosPoi(cens,rads,cols = [(255,0,0,255),(0,255,0,255),(0,0,255,255)]):
for i in range(3):
dramap.ellipse((cens[i][0]-rads[i],cens[i][1]-rads[i],cens[i][0]+rads[i],cens[i][1]+rads[i]), fill = cols[i])
def getPos(img):
tc = 0
pos = (0,0)
for i in range(img.width):
for j in range(img.height):
ca = img.getpixel((i,j))
if ca == (255,0,0,255):
tc+=1
pos = (i+1,j+1)
if tc == 1:
return pos
tx = 0
for i in range(img.height):
for j in range(img.width):
ca = img.getpixel((j,i))
if ca == (0,255,0,255):
tc+=1
pos = (j+1,i+1)
if tc == 1:
return pos
elif tc == 2:
return pos
tc = 0
poss = []
for i in data:
img = Image.new("RGBA",(w,h))
dramap = ImageDraw.Draw(img)
PosPoi([[0,0],[img.width,0],[img.width,img.height]],i)
poss.append(getPos(img))
lastPoint = poss[0]
mapImg = Image.new("RGBA",(w,h))
for i in poss:
dramap = ImageDraw.Draw(mapImg)
dramap.line((lastPoint[0],lastPoint[1],i[0],i[1]), fill = (0,0,0))
lastPoint = i
mapImg.show()
print(poss)
经检验,坐标定位基本相符
这证明我的代码是正确的
本帖内所有代码,思想仅供参考,请勿用于盈利用途
id:小鹿工作室_天上的流星
如果喜欢点个赞再走呗