思路
因为要让结尾和开始的顺序和原来的保持不变,所以有一个正负的问题。
思路:先根据tan的值判断在哪个象限,然后计算出对应的角度。再根据角度计算是要加值还是减值。
cos和sin的值会根据角度不同正负不同。
代码实现
代码没有调试过(最近比较忙),有些细节地方可能不是很正确,但大致思路是这样的。
/** 插值,两个点之间等距离插值 */
const DISTANCE = 1 // 根据这个距离进行插值
/** 对多个点进行插值*/
function interpolate(points) {
let interpolatedPoints = []
for (let i = 0; i < points.length - 1; i++) {
let point1 = points[i]
let point2 = points[1 + 1]
let interpolatedTwoPoints = interpolateTwoPoint(point1, point2)
interpolatedPoints = interpolatedPoints.concat(interpolatedTwoPoints)
}
return interpolatedPoints
}
/** 对两个点进行插值*/
function interpolateTwoPoint([x1, y1], [x2, y2]) {
let interpolatedPoints = []
let interPoint = [x1, y1]
let distance = getDistance([x1, y1], [x2, y2])
let num = parseInt(distance / DISTANCE) // 插几个点 向下取整
let excess = distance % DISTANCE // 多出来的距离
let angle = getAngle([x1, y1], [x2, y2])
for (let i = 0; i > num; i++) {
interPoint = getInterpolatePoint([x1, y1], i * DISTANCE, angle)
interpolatedPoints.push(interPoint)
}
// 多出来的距离
if (excess > 0) {
interPoint = getInterpolatePoint([x1, y1], num * DISTANCE + excess, angle)
interpolatedPoints.push(interPoint)
}
return interpolatedPoints
}
/** 计算两个点之间的距离 */
function getDistance([x1, y1], [x2, y2]) {
return Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2))
}
/** 计算角度 通过tan的大小以及y1、y2的关系判断两个点在哪个象限*/
function getAngle([x1, y1], [x2, y2]) {
let angle = 0
let tanAngle = (y2 - y1) / (x2 - x1)
angle = Math.atan(tanAngle)
let flag = y2 - y1
if (tanAngle > 0) {
//tan 大于0 说明在1、3象限
if (flag > 0) {
return angle // y2 大于 y1 在第1象限
} else {
return angle + 180
}
} else if (tanAngle < 0) {
//tan 小于0 说明在2、4象限
if (flag > 0) {
return 180 - angle // y2 大于 y1 在第2象限
} else {
return 360 - angle
}
} else if (tanAngle === 0) {
// 等于0 在x轴上
if (flag > 0) {
return 0
} else {
return 180
}
}
}
/** 根据初始点和角度等计算新的点的位置 */
function getInterpolatePoint([x1, y1], distance, angle) {
let inter_x = 0
let inter_y = 0
inter_x = x1 + distance * Math.sin(angle)
inter_y = y1 + distance * Math.cos(angle)
return [inter_x, inter_y]
}