modify test case

This commit is contained in:
kekee000
2015-03-25 23:42:40 +08:00
parent 72b8d3ce4c
commit 420748c5fd
14 changed files with 311 additions and 277 deletions

View File

@@ -78,7 +78,7 @@ define(
// 渲染器相关
render: {
defaultRatio: 1.2, // 默认的缩放比例
minScale: 0.2, // 最小缩放
minScale: 0.1, // 最小缩放
maxScale: 200, // 最大缩放
enableScale: true, // 是否允许缩放
enableResize: true // 是否允许大小改变

View File

@@ -1,215 +0,0 @@
/**
* @file 查找轮廓中的关键点
* @author mengke01(kekee000@gmail.com)
*
* 查找方法为此处文章的方法
* http://wenku.baidu.com/link?url=Sz1BbYjfA7IeHAMVJ1TPlXiMhACc6sWhHliPJqAUxxtC5K9PYf4j3ile6patUEUMOE_9uJdsS1EGJBFLVbhXcn7Qe8l_FxuT3QVI8nm1aZG
*
* 关键点标记定义:
*
* p.left 左侧类型
* p.right: 右侧类型
* 直线为1,曲线为2
*/
define(
function (require) {
var makeLink = require('../pathUtil').makeLink;
var getCos = require('../vector').getCos;
var THETA_THRESHOLD = 0.1; // 夹角抑制
var THETA_CORNER = 0.4; // 拐点抑制
/**
* 标记轮廓中的曲线和直线
*
* @param {Array} contour 轮廓点集
* @param {Array} breakPoints 关键点
*/
function markBreakPoint(contour, breakPoints) {
var start = breakPoints[0];
var end;
var mid;
for (var i = 1, l = breakPoints.length; i < l; i++) {
end = breakPoints[i];
// 中间点小于3个,则判断为直线
var count = i === l - 1 ? l - end.index : end.index - start.index;
if (count < 4) {
start.right = 1;
end.left = 1;
}
else {
// 判断向量夹角
if (i === l - 1) {
mid = contour[Math.floor(end.index + (l + end.index) / 2)];
}
else {
mid = contour[Math.floor((start.index + end.index) / 2)];
}
// 夹角接近直线
if (1 - Math.abs(getCos(mid.x - start.x, mid.y - start.y, mid.x - end.x, mid.y - end.y)) < 0.002) {
start.right = 1;
end.left = 1;
}
// 标记为待选曲线
else {
start.right = 2;
end.left = 2;
}
}
start = end;
}
}
/**
* 查找轮廓中的关键点
*
* @param {Array} contour 轮廓点集合
* @return {Array} 轮廓点集合
*/
function findBreakPoints(contour) {
contour = makeLink(contour);
var r = contour.length > 10 ? 8 : 4;
var left = contour[0];
var right = contour[0];
var j = 0;
while (j++ < r) {
left = left.prev;
right = right.next;
}
for (var i = 0, l = contour.length; i < l; i++) {
var p = contour[i];
// 左侧分量
var leftX = 0;
var leftY = 0;
var cur = left;
while (cur !== p) {
leftX += cur.x;
leftY += cur.y;
cur = cur.next;
}
// 右侧分量
var rightX = 0;
var rightY = 0;
cur = right;
while (cur !== p) {
rightX += cur.x;
rightY += cur.y;
cur = cur.prev;
}
leftX = leftX / r;
leftY = leftY / r;
rightX = rightX / r;
rightY = rightY / r;
if (rightX - p.x === 0) {
console.log('xx');
}
// 计算theta夹角
var theta1 = Math.atan2(rightY - p.y, rightX - p.x);
var theta2 = Math.atan2(p.y - leftY, p.x - leftX);
p.theta = (theta1 > 0 ? theta1 : Math.PI - theta1) - (theta2 > 0 ? theta2 : Math.PI - theta2);
p.absTheta = getCos(rightX - p.x, rightY - p.y, p.x - leftX, p.y - leftY);
if (p.absTheta > THETA_THRESHOLD) {
p.mark = true;
}
left = left.next;
right = right.next;
}
var breakPoints = [];
contour.forEach(function (p) {
if (p.mark && !p.visited) {
// 寻找角点
if (p.absTheta >= THETA_CORNER) {
breakPoints.push(p);
j = 0;
left = p;
right = p;
var max = p.absTheta;
var min = p.absTheta;
while (j++ < r) {
left = left.prev;
right = right.next;
if (left.absTheta > max) {
max = left.absTheta;
}
if (left.absTheta < min) {
min = left.absTheta;
}
if (right.absTheta > max) {
max = right.absTheta;
}
if (right.absTheta < min) {
min = right.absTheta;
}
}
if (max === p.absTheta) {
console.log(max, min);
p.breakPoint = true;
//breakPoints.push(p);
j = 0;
while (j++ < r) {
left.visited = right.visited = true;
left = left.prev;
right = right.next;
}
}
}
// 寻找相切点和拐点
else {
j = 0;
left = p;
right = p;
var max = p.theta;
// 寻找左右符号
var leftEpsilonCount = 0;
var rightEpsilonCount = 0;
while (j++ < r) {
left = left.prev;
right = right.next;
if (left.theta < THETA_THRESHOLD) {
leftEpsilonCount++;
}
if (right.theta < THETA_THRESHOLD) {
rightEpsilonCount++;
}
}
// if (leftEpsilonCount > r - 1 || rightEpsilonCount > r - 1) {
// breakPoints.push(p);
// }
}
}
});
breakPoints.sort(function (a, b) {
return a.index - b.index;
});
markBreakPoint(contour, breakPoints);
return breakPoints;
}
return findBreakPoints;
}
);

View File

@@ -295,7 +295,7 @@ define(
function findBreakPoints(contour) {
contour = makeLink(contour);
var r = contour.length > 10 ? 16 : 4;
var r = contour.length > 16 ? 12 : 4;
var j = 0;
for (var i = 0, l = contour.length; i < l; i++) {
var p = contour[i];
@@ -440,7 +440,7 @@ define(
return a.index - b.index;
});
breakPoints = filterBreakPoint(contour, breakPoints, r);
//breakPoints = filterBreakPoint(contour, breakPoints, r);
return breakPoints;
}

View File

@@ -13,12 +13,10 @@ define(
var vector = require('graphics/vector');
function fitContour(data) {
data = pathUtil.scale(data, 10);
function fitContour(data, scale) {
scale = scale || 1;
var breakPoints = findBreakPoints(data);
var resultContour = [];
var isLast;
var start;
@@ -77,10 +75,14 @@ define(
tHat1 = null;
}
var bezierCurve = fitBezier(bezierCurvePoints, 10, tHat1);
var bezierCurve = fitBezier(bezierCurvePoints, scale, tHat1);
if (bezierCurve.length) {
bezierCurve.forEach(function (p) {
resultContour.push(p);
resultContour.push({
x: p.x,
y: p.y,
onCurve: p.onCurve
});
});
tHat1Point = bezierCurve[bezierCurve.length - 2];
}
@@ -93,11 +95,7 @@ define(
}
}
resultContour = pathUtil.scale(resultContour, 0.1);
data = pathUtil.scale(data, 0.1);
return resultContour;
return pathUtil.deInterpolate(resultContour);
}
return fitContour;