Cristián Romo
그는 물었다 12년 전
9

간격이 동일한 방향점 구현하므로 베지어 곡선

현재 I& # 39 m, 여러 개 만들 시도중입니다 베지 %s/dbase/ext_table. 간격이 동일한 점. # 39 m, 현재 사용하고 있는 점을 기록했지만, 삼차 보간은 i& 찾을 수 있기 때문에 일부 영역은 다른 디바이스보다 운행에서어떠한 베지 작동합니까 집적도 증가 및 검증을 위한 더럽게시리 텍스처 매핑 슬픔으로창백해지고 가변으로 거리. 거리에 따라 베지어 방향점 찾을 수 있는 방법이 아닌 (백분율)? 또한 이 여러 접속됨 커브에는 가능 확장할 수 있다

답변 3 개

이 호출됨 &quot 호 length"; 매개변수화를. 내가 이 몇 년 전 대한 논문을 썼다.

http://www.saccade.com/writing/graphics/RE-PARAM.PDF

이 의견은 한 &quot parameterization&quot 미리 계산;; 커브, 그리고 커브 평가하십시오 통해 iqn.

Ciantic
그는 7년 전 댓글을 달았습니다
0

39 종이, 아직 완전히 haven& 읽을 수 없다. 그러나 I& # 39 더 나은 방법으로 정의할 수 있는 하나님께용서를 하는 경우, d, t need to be &quot 커브에는 wouldn& # 39 converted"; 이번이 처음이다. E. g. 들어보겠소 다운로드되었는지 I& NURBS 커브가, 모든 경로를 사용하여 정의하십시오; d # 39 호 길이 될 것 "이라며" 빠른 it 지원부에 간격이 동일한 파라메트리제이션? 또는 다른 방법으로 아마도? 편집: 내가 더 빠른 CPU 나 GPU 에서 사용하는 것은 아니다.

J. Peterson
그는 7년 전 댓글을 달았습니다
0

Nurbs won& # 39 를 사용하여, t 도움말에서는 근본적인 문제를 동일합니다. The end of the paper 작성 방법을 사용한 원래 이 re 매개변수화를 커브를 보여 줍니다. 이 경우 얻을 수 있지만 새로운 커브와 호 길이 매개변수화를 주문하십시오 커브 (curve) 가 높은, 그래서 it& # 39 의 느리게 평가하십시오.

p_0 및 P_3 사이의 거리 (m3 의 양식) 가 있다는 것을 알고, 간단하지는 있음-그러나 한다고 생각합니다.

호 길이 거리 커브 상에 불과합니다.

[그림 1] [1]!

여기서:

[그림 2] [2]!

(자세한 내용은 미삭)

아마도 you& # 39, d 가 t_0 t_1 (t) = 0 = 0, dz = 1.0, 그리고 (2d clip%).

[1]: http://www.codecogs.com/eq.latex} {} {{t1 P& # % ^ %? \int t_0 20 20 (t) %20dt 39. [2]: http://www.codecogs.com/eq.latex? P% 27 (t) = % %20 [{x%의 27, y% 27, z% 27}] 20 20 = % %20 [{\frac {dx (t)} {dt/} \frac {dy (t)} \frac {}, {dt/ dt/ dz (t)} {}}]

nlucaroni
CromTheDestroyer
그는 10년 전 댓글을 달았습니다
5

이것은 어떻게 찾을 수 있지만, 이 함수의 보색으로 간격이 동일한 점 등을 감안할 때 매개변수입니다 발견사항 호 길이 필요합니다. 다른 한 피쳐로부터 가져오는 게 아니다. @Christian 로모: 이거 어떻게 했어? 내 말은, 이진 탐색, 그렇다고 그냥 약간만이라도 무섭게 느린 사용할 수 있습니다 (뭐하러요 I& # 39, m trying to do, 어쨌든).

이것은 오래된 질문 하지만 난 알아요 '를 이 문제를 해결하기 위해 최근 실행했음 위베치라파스 만들고 있는' 'X' 'Y' 좌표계나 좌표계나 주어진 범위 및 바이스 같은 이치다. 쓴 것을.

https://github.com/rkotzy/RKBezierMath

extension UIBezierPath {

func solveBezerAtY(start: CGPoint, point1: CGPoint, point2: CGPoint, end: CGPoint, y: CGFloat) -> [CGPoint] {

    // bezier control points
    let C0 = start.y - y
    let C1 = point1.y - y
    let C2 = point2.y - y
    let C3 = end.y - y

    // The cubic polynomial coefficients such that Bez(t) = A*t^3 + B*t^2 + C*t + D
    let A = C3 - 3.0*C2 + 3.0*C1 - C0
    let B = 3.0*C2 - 6.0*C1 + 3.0*C0
    let C = 3.0*C1 - 3.0*C0
    let D = C0

    let roots = solveCubic(A, b: B, c: C, d: D)

    var result = [CGPoint]()

    for root in roots {
        if (root >= 0 && root <= 1) {
            result.append(bezierOutputAtT(start, point1: point1, point2: point2, end: end, t: root))
        }
    }

    return result
}

func solveBezerAtX(start: CGPoint, point1: CGPoint, point2: CGPoint, end: CGPoint, x: CGFloat) -> [CGPoint] {

    // bezier control points
    let C0 = start.x - x
    let C1 = point1.x - x
    let C2 = point2.x - x
    let C3 = end.x - x

    // The cubic polynomial coefficients such that Bez(t) = A*t^3 + B*t^2 + C*t + D
    let A = C3 - 3.0*C2 + 3.0*C1 - C0
    let B = 3.0*C2 - 6.0*C1 + 3.0*C0
    let C = 3.0*C1 - 3.0*C0
    let D = C0

    let roots = solveCubic(A, b: B, c: C, d: D)

    var result = [CGPoint]()

    for root in roots {
        if (root >= 0 && root <= 1) {
            result.append(bezierOutputAtT(start, point1: point1, point2: point2, end: end, t: root))
        }
    }

    return result

}

func solveCubic(a: CGFloat?, var b: CGFloat, var c: CGFloat, var d: CGFloat) -> [CGFloat] {

    if (a == nil) {
        return solveQuadratic(b, b: c, c: d)
    }

    b /= a!
    c /= a!
    d /= a!

    let p = (3 * c - b * b) / 3
    let q = (2 * b * b * b - 9 * b * c + 27 * d) / 27

    if (p == 0) {
        return [pow(-q, 1 / 3)]

    } else if (q == 0) {
        return [sqrt(-p), -sqrt(-p)]

    } else {

        let discriminant = pow(q / 2, 2) + pow(p / 3, 3)

        if (discriminant == 0) {
            return [pow(q / 2, 1 / 3) - b / 3]

        } else if (discriminant > 0) {
            let x = crt(-(q / 2) + sqrt(discriminant))
            let z = crt((q / 2) + sqrt(discriminant))
            return [x - z - b / 3]
        } else {

            let r = sqrt(pow(-(p/3), 3))
            let phi = acos(-(q / (2 * sqrt(pow(-(p / 3), 3)))))

            let s = 2 * pow(r, 1/3)

            return [
                s * cos(phi / 3) - b / 3,
                s * cos((phi + CGFloat(2) * CGFloat(M_PI)) / 3) - b / 3,
                s * cos((phi + CGFloat(4) * CGFloat(M_PI)) / 3) - b / 3
            ]

        }

    }
}

func solveQuadratic(a: CGFloat, b: CGFloat, c: CGFloat) -> [CGFloat] {

    let discriminant = b * b - 4 * a * c;

    if (discriminant < 0) {
        return []

    } else {
        return [
            (-b + sqrt(discriminant)) / (2 * a),
            (-b - sqrt(discriminant)) / (2 * a)
        ]
    }

}

private func crt(v: CGFloat) -> CGFloat {
    if (v<0) {
        return -pow(-v, 1/3)
    }
    return pow(v, 1/3)
}

private func bezierOutputAtT(start: CGPoint, point1: CGPoint, point2: CGPoint, end: CGPoint, t: CGFloat) -> CGPoint {

    // bezier control points
    let C0 = start
    let C1 = point1
    let C2 = point2
    let C3 = end

    // The cubic polynomial coefficients such that Bez(t) = A*t^3 + B*t^2 + C*t + D
    let A = CGPointMake(C3.x - 3.0*C2.x + 3.0*C1.x - C0.x, C3.y - 3.0*C2.y + 3.0*C1.y - C0.y)
    let B = CGPointMake(3.0*C2.x - 6.0*C1.x + 3.0*C0.x, 3.0*C2.y - 6.0*C1.y + 3.0*C0.y)
    let C = CGPointMake(3.0*C1.x - 3.0*C0.x, 3.0*C1.y - 3.0*C0.y)
    let D = C0

    return CGPointMake(((A.x*t+B.x)*t+C.x)*t+D.x, ((A.y*t+B.y)*t+C.y)*t+D.y)
}

// TODO: - future implementation
private func tangentAngleAtT(start: CGPoint, point1: CGPoint, point2: CGPoint, end: CGPoint, t: CGFloat) -> CGFloat {

    // bezier control points
    let C0 = start
    let C1 = point1
    let C2 = point2
    let C3 = end

    // The cubic polynomial coefficients such that Bez(t) = A*t^3 + B*t^2 + C*t + D
    let A = CGPointMake(C3.x - 3.0*C2.x + 3.0*C1.x - C0.x, C3.y - 3.0*C2.y + 3.0*C1.y - C0.y)
    let B = CGPointMake(3.0*C2.x - 6.0*C1.x + 3.0*C0.x, 3.0*C2.y - 6.0*C1.y + 3.0*C0.y)
    let C = CGPointMake(3.0*C1.x - 3.0*C0.x, 3.0*C1.y - 3.0*C0.y)

    return atan2(3.0*A.y*t*t + 2.0*B.y*t + C.y, 3.0*A.x*t*t + 2.0*B.x*t + C.x)
}

}