猫史档案馆


【代码秀】地图复制器重要功能

用户:天上的流星_tianqiVirus天上的流星_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:小鹿工作室_天上的流星

如果喜欢点个赞再走呗


回复

上一页1 页 / 共 1下一页
ohdreamohdream

sofa+挖坟

点赞0


评论