最近有一个实际的需求,需要用到求凸集,这次用js实现是为了让自己真正了解此过程,并能检测实现的对不对。
<html>
<head>
<meta charset = "utf-8" / >
<title>TSP_demotitle>
head>
<body>
<div id="outText">
div>
<canvas id="canvas" height="550px" width="1024px">
canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var canvasWidth = canvas.width;
var canvasHeight = canvas.height;
var context = canvas.getContext("2d");
// 未使用
function initMat(M, N, val) {
var x = new Array();
for(var i = 0; i < M; i++) {
x[i] = new Array();
for(var j = 0; j < N; j++)
x[i].push(val);
}
return x;
}
function drawPath(x1, y1, x2, y2, color, width) {
context.beginPath();
context.fillStyle = color;
context.strokeStyle = color;
context.lineWidth = width;
context.moveTo(x1, y1);
context.lineTo(x2, y2);
context.stroke();
}
function drawCities(p) {
for(var i = 0; i < p.length ; i++) {
context.beginPath();
context.fillStyle = "blue";
context.strokeStyle = "blue";
context.lineWidth = 1;
context.font = "normal 16px Arial";
context.arc(p[i].x, p[i].y, 3, (Math.PI / 180) * 0, (Math.PI / 180) * 360, false);
context.fill();
context.stroke();
context.closePath();
if(p[i].tj==true){
context.fillStyle = "red";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText(String(i), p[i].x, p[i].y-8);
}
}
}
function output(string){
var out = document.getElementById("outText");
out.innerHTML+=string
}
// 可以借助cos a 在0-180之间,单调递减!!!
// 这里用的是叉积,正弦的判断
function multiply(p0,p1,p2){
return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
function distance_no_sqrt(p1,p2)
{
//return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
return((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
function Graham_scan(pointSet,ch,n){
// 这里会修改pointSet
var i,j,k=0,top=2;
var tmp=new Object();
// 找到一个基点,基本就是保证最下面最左面的点
for(i=1;iif ( (pointSet[i].y0];
pointSet[0]=pointSet[k];
pointSet[k]=tmp;
use=n;
for (i=1;i1;i++){
k=i;
for (j=i+1;j
运行效果
注意,canvas的原点是在左上角,因此基准点位置看起来与直觉不一样。
上图中蓝色的点是随机生成的,上面标红色数字的是凸集的顶点。
另外这次用chrome调试,感觉不比firefox差。