MegCup 2017 极客挑战赛 初赛试题

695653-20170225214624929-574626451.png

看着像八卦,数数不是八卦,是29卦
每卦又有29个小弧
所以是29×29个bit
这29×29个bit怎么理解呢?并且从哪一卦开始到哪一卦结束?是先环向层层向里走还是先径向逐卦走?
我想不出来。
我猜测:
可能是这个二进制串可以翻译成某个ASCII字符串,可能这个二进制串是通过Base64编码过的,可能性太多了

问林教主。
林教主说:从圆心沿180度方向向外剪开,剪开之后就得到一个小扇子,这个小扇子其实是一个正方形,这个正方形图片就是一个二维码,拿出手机来一扫就进入一个URL链接,就大功告成了。
695653-20170226010426179-790885263.png

问怎么想出来的?
林教主说:二维码4个角处有3个正方形,看到了180度方向有两个正方形,这个八卦本身又像二维码。
问怎么转化成正方形二维码?
林教主说:一张笔一支纸一小时
我说:那还了得

这个可以编程实现。
关键是:根据(第几个扇形,第几个弧)两个变量可以求出来该小弧的颜色。

说起来简单,操作起来还是遇到不少问题:

  • 中间有一个小圆圈,这个小圆圈的半径必须求出来。这个问题可以通过图形化界面,鼠标悬浮一下大约估计一下。
  • 每个小弧的厚度必须求出来,这个当然可以根据第一个问题中小圆圈的半径求出来。
  • 这个图片格式是RGBA格式的,也就是说包含透明色,透明色默认就是白色,而不透明色可能是白色也可能是黑色,每个像素的RGB也不是纯黑纯白,所以需要“纯化一下”,让它变成非黑即白的模式。这是一个预处理的过程。

695653-20170225220232507-876385580.png

下面是代码,用PIL图片处理模块和tkinter两个模块

"""
图形化界面确定一些参数:比如中间圆圈的半径
"""
from PIL import Image, ImageTk
import tkinter
import math

window = tkinter.Tk()
img = Image.open("w.png")
sz = img.size[0]


def init():
    # 预处理图片,使之变成纯黑纯白
    def getColor(c):
        # 去除噪声
        if c[3] == 0:
            return 255, 255, 255, 255
        if c[3] == 255:
            if c[0] > 128 and c[1] > 128 and c[2] > 128:
                return 255, 255, 255, 255
        return 0, 0, 0, 255

    for i in range(sz):
        for j in range(sz):
            img.putpixel((i, j), getColor(img.getpixel((i, j))))


init()
image = ImageTk.PhotoImage(img)
canvas = tkinter.Canvas(width=image.width(), height=image.height())
canvas.pack()
canvas.create_image(sz / 2, sz / 2, image=image)


def getBit(x, y):
    c = sz / 2  # 中心坐标
    r = 44  # 中心圆盘半径
    w = (c - r) / 29
    R = r + (x + 0.5) * w
    theta = (math.pi * 2 / 29) * (y + 0.5)
    x, y = c - R * math.cos(theta), c - R * math.sin(theta)
    x, y = int(x), int(y)
    color = img.getpixel((x, y))
    return color[:3]


def hover(e):
    window.title("%d,%d,%s" % (e.x, e.y, str(img.getpixel((e.x, e.y)))))


def go():
    # 获取二维码图片
    ans = Image.new("RGB", (30, 30))
    for i in range(29):
        for j in range(29):
            ans.putpixel((i, j), getBit(i, j))
    ans = ans.resize((290, 290))
    ans.show("haha")


def getParams():
    # 获取参数
    window.bind("<Motion>", hover)
    window.mainloop()


# getParams()
go()

转载于:https://www.cnblogs.com/weiyinfu/p/6442999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值