凸包 - グラハムスキャン

凸包 - グラハムスキャン

by s_yoshiki

HTML

<div id="msg">

</div>
<br>
<div id="content">
    <canvas id="canvas" width="600" height="600"></canvas>
</div>
<hr>

<table>
    <tr>
        <td>要素数 </td>
        <td><input type="text" value="20" id="node"></td>
    </tr>
    <tr>
        <td>アニメーションフレーム </td>
        <td><input type="text" value="150" id="frame"></td>
    </tr>
</table>

JavaScript

(function(){
    
    //次元数
    var dim = 2;
    var animationFrame = 10;
    var textArrayMax = 5300;
    var range = 512;
    var ptnMap = []
    var classNode = 1
    
    main();
    
    function init(){
        textArrayMax= parseInt(document.getElementById("node").value,10);
        animationFrame = parseInt(document.getElementById("frame").value,10);
    }
    
    function main(){
	    var status = 0
        var count = 0
        var path = []
        var k = 0
        
    	init()
        var ptnMap = []
        
		try{
            logic();
        }catch(e){
            document.getElementById("msg").innerHTML= e;
        }
        
        function logic(){
            //init
            clearCanvas()
            
            if (status === 0) {
            	ptnMap = initMat(dim,textArrayMax)
            	init()
                status++
            
            } else if (status === 1) {
                var minPoints = 255
                var minIndex  = 0
                
                for (var i = 1;i <= count; i++) {
                	drawLine(ptnMap[i], ptnMap[i-1], 3, "rgb(193,1,0)")
                    if (ptnMap[i][0] < minPoints) {
                    	minPoints = ptnMap[i][0]
                        minIndex = i
                    }
                }
                drawPoint(ptnMap[minIndex], 8, "rgb(20,90,200)")
                
            	count++
                if (ptnMap.length === count) {
                	count = 0
                	status++
                }
            
            } else if (status === 2) {
            	ptnMap = sortMat(ptnMap, 0)
               	
                for (var i = 1;i <= count; i++) {
                    drawLine(ptnMap[0], ptnMap[i], 3, "rgb(193,1,0)")
                }
                drawPoint(ptnMap[0], 8, "rgb(20,90,200)")
                drawPoint(ptnMap[count], 8, "rgb(20,90,200)")

				count++
                if (ptnMap.length === count) {
                	count = 0
                	status++
 ...