MegCup 2017 極客挑戰賽 初賽試題


看着像八卦,數數不是八卦,是29卦
每卦又有29個小弧
所以是29×29個bit
這29×29個bit怎么理解呢?並且從哪一卦開始到哪一卦結束?是先環向層層向里走還是先徑向逐卦走?
我想不出來。
我猜測:
可能是這個二進制串可以翻譯成某個ASCII字符串,可能這個二進制串是通過Base64編碼過的,可能性太多了

問林教主。
林教主說:從圓心沿180度方向向外剪開,剪開之后就得到一個小扇子,這個小扇子其實是一個正方形,這個正方形圖片就是一個二維碼,拿出手機來一掃就進入一個URL鏈接,就大功告成了。

問怎么想出來的?
林教主說:二維碼4個角處有3個正方形,看到了180度方向有兩個正方形,這個八卦本身又像二維碼。
問怎么轉化成正方形二維碼?
林教主說:一張筆一支紙一小時
我說:那還了得

這個可以編程實現。
關鍵是:根據(第幾個扇形,第幾個弧)兩個變量可以求出來該小弧的顏色。

說起來簡單,操作起來還是遇到不少問題:

  • 中間有一個小圓圈,這個小圓圈的半徑必須求出來。這個問題可以通過圖形化界面,鼠標懸浮一下大約估計一下。
  • 每個小弧的厚度必須求出來,這個當然可以根據第一個問題中小圓圈的半徑求出來。
  • 這個圖片格式是RGBA格式的,也就是說包含透明色,透明色默認就是白色,而不透明色可能是白色也可能是黑色,每個像素的RGB也不是純黑純白,所以需要“純化一下”,讓它變成非黑即白的模式。這是一個預處理的過程。

下面是代碼,用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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM