Jump to content

File:GrahamScanDemo.gif

Page contents not supported in other languages.
This is a file from the Wikimedia Commons
From Wikipedia, the free encyclopedia
    Original file (344 × 353 pixels, file size: 217 KB, MIME type: image/gif, looped, 51 frames, 41 s)

    Summary

    Description
    English: A demo of Graham's Scan, auto-generated by a Python program. The red lines connect the points in the stack. The blue line connects the observed point with the top of stack.
    Date
    Source Own work
    Author Shiyu Ji

    Python 3 Code

    '''
    Convex Hull Demo (SVG) for Graham's Scan.
    Firstly use this code to generate SVG frames.
    Then transform to bitmaps and convert to GIF.
    '''
    
    # range size
    N = 300
    margin = 50
    
    def saveToSVG(nFrames, points, firmed, trying):
        f = open('demo_'+str(nFrames)+'.svg', 'w')
        f.write("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n")
        for p in points:
            f.write("<circle cx=\"" +str(p[0]+margin)+ "\" cy=\""+ str(N-p[1]+margin) +"\" r=\"5\" fill=\"white\" stroke=\"black\"/>\n")
        for i in range(len(firmed)-1):
            f.write("<line x1=\"" +str(firmed[i][0]+margin)+ "\" y1=\""+ str(N-firmed[i][1]+margin) +"\" x2=\"" + str(firmed[i+1][0]+margin) + "\" y2=\"" + str(N-firmed[i+1][1]+margin) + "\" stroke=\"red\" stroke-width=\"5\"/>\n")
        for i in range(len(trying)-1):
            f.write("<line x1=\"" +str(trying[i][0]+margin)+ "\" y1=\""+ str(N-trying[i][1]+margin) +"\" x2=\"" + str(trying[i+1][0]+margin) + "\" y2=\"" + str(N-trying[i+1][1]+margin) + "\" stroke=\"blue\" stroke-width=\"5\"/>\n")
        f.write("</svg>\n")
        f.close()
    
    def generatePoints(n):
        import random as r
        r.seed(100)
        
        res = []
        for i in range(n):
            pt = [r.randint(0,N) for _ in [0, 1]]
            if [pt] not in res:
                res += [pt]
        return res
    
    def norm(x, y):
        return (x*x+y*y)**.5
    
    def dotProductNormed(x1, y1, x2, y2):
        return (x1*x2+y1*y2)/norm(x1, y1)/norm(x2, y2)
    
    def cross(x1, y1, x2, y2):
        return x1*y2 - x2*y1
    
    def graham(n, points):
        if n<3: return
        nframe = 0;
        points.sort(key = lambda x: x[1])
        first = points[0]
        rest = points[1:]
        rest.sort(key = lambda x: -dotProductNormed(x[0]-points[0][0], x[1]-points[0][1], 1, 0))
        points = [first] + rest
        stack = [points[0], points[1]]
        saveToSVG(nframe, points, stack, [stack[-1], points[2]])
        nframe += 1
        i=2
        while i<n:
            x0, y0 = stack[-2][0], stack[-2][1]
            x1, y1 = stack[-1][0], stack[-1][1]
            x2, y2 = points[i][0], points[i][1]
            if cross(x1-x0, y1-y0, x2-x0, y2-y0)<0:
                stack.pop()
            else:
                stack += [points[i]]
                i+=1
            if i<n:
                saveToSVG(nframe, points, stack, [stack[-1], points[i]])
            else:
                saveToSVG(nframe, points, stack+[points[0]], [])
            nframe += 1
        return stack
    
    # test 30 points temporarily
    n = 30
    pts = generatePoints(n)
    graham(n, pts)
    

    Licensing

    I, the copyright holder of this work, hereby publish it under the following license:
    w:en:Creative Commons
    attribution share alike
    This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
    You are free:
    • to share – to copy, distribute and transmit the work
    • to remix – to adapt the work
    Under the following conditions:
    • attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
    • share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.

    Captions

    Add a one-line explanation of what this file represents

    Items portrayed in this file

    depicts

    23 December 2016

    222,366 byte

    353 pixel

    344 pixel

    image/gif

    227e4cde75dd9fa14a7095e31356b90632918a2b

    File history

    Click on a date/time to view the file as it appeared at that time.

    Date/TimeThumbnailDimensionsUserComment
    current10:05, 23 December 2016Thumbnail for version as of 10:05, 23 December 2016344 × 353 (217 KB)Shiyu JiUser created page with UploadWizard

    The following 3 pages use this file:

    Global file usage

    The following other wikis use this file: