多边形等边距缩小算法实现

334 阅读1分钟

Snipaste_2023-04-13_15-12-16.png 图是偷的,代码是根据一篇python文章改过来的,如果你的是二维注意根据数据结构调整一下; 具体效果从外边图形点得到里边图形的点坐标,且点和点距离是固定值。 实现原理不知道:但是个人感觉blog.csdn.net/happy__888/… 这个篇文章讲的不错,有问题别私信我,我只会抄

数据结构

let data = [
    {
        "x": -5.160273,
        "y": 0,
        "z": -5.442592800000001
    },
    {
        "x": -6.193109999999999,
        "y": 0,
        "z": 5.5906822
    },
    {
        "x": 7.282171,
        "y": 0,
        "z": 7.1086291999999975
    },
    {
        "x": 9.231485,
        "y": 0,
        "z": -1.8141258000000011
    },
    {
        "x": -5.160273,
        "y": 0,
        "z": -5.442592800000001
    }
]

代码封装

function scal(data, sec_dis) {
    let scal_data = []
    for (let i = 0; i < data.length - 1; i++) {
        let n = i > 0 ? i - 1 : data.length - 2;
        let x1 = data[i].x - data[n].x
        let y1 = data[i].z - data[n].z
        let x2 = data[(i + 1) % data.length].x - data[i].x
        let y2 = data[(i + 1) % data.length].z - data[i].z

        let d_A = (x1 ** 2 + y1 ** 2) ** 0.5
        let d_B = (x2 ** 2 + y2 ** 2) ** 0.5
u
        let Vec_Cross = (x1 * y2) - (x2 * y1)

        let sin_theta = Vec_Cross / (d_A * d_B)

        let dv = sec_dis / sin_theta

        let v1_x = (dv / d_A) * x1
        let v1_y = (dv / d_A) * y1

        let v2_x = (dv / d_B) * x2
        let v2_y = (dv / d_B) * y2

        let PQ_x = v1_x - v2_x
        let PQ_y = v1_y - v2_y

        let Q_x = data[(i)].x + PQ_x
        let Q_y = data[(i)].z + PQ_y

        scal_data.push({
            x: Q_x,
            y: 0,
            z: Q_y,
        })
    }
    return scal_data
}
```
```