diff options
author | Norbert Preining <norbert@preining.info> | 2020-03-04 03:02:32 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-03-04 03:02:32 +0000 |
commit | 19d25b8009801aa98ea2f46b45c37c257f990491 (patch) | |
tree | c0da70fbab26feff40e87df289ae797917df8419 /graphics/asymptote/beziercurve.cc | |
parent | b78f5a6705512314d6fe42fd5144c5f8e5d484ce (diff) |
CTAN sync 202003040302
Diffstat (limited to 'graphics/asymptote/beziercurve.cc')
-rw-r--r-- | graphics/asymptote/beziercurve.cc | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/graphics/asymptote/beziercurve.cc b/graphics/asymptote/beziercurve.cc index 23f5fc6779..9a5eee79f2 100644 --- a/graphics/asymptote/beziercurve.cc +++ b/graphics/asymptote/beziercurve.cc @@ -20,11 +20,30 @@ void BezierCurve::init(double res) MaterialIndex=materialIndex; } +inline triple normal(triple bP, triple bPP) +{ + return dot(bP,bP)*bPP-dot(bP,bPP)*bP; +} + void BezierCurve::render(const triple *p, bool straight) { - GLuint i0=data.vertex1(p[0]); - GLuint i3=data.vertex1(p[3]); - + triple p0=p[0]; + triple p3=p[3]; + triple n0,n1; + + if(straight) { + n0=n1=triple(0.0,0.0,1.0); + } else { + triple p1=p[1]; + triple p2=p[2]; + + n0=normal(p1-p0,p0+p2-2.0*p1); + n1=normal(p3-p2,p3+p1-2.0*p2); + } + + GLuint i0=data.vertex(p0,n0); + GLuint i3=data.vertex(p3,n1); + if(straight) { std::vector<GLuint> &q=data.indices; q.push_back(i0); @@ -34,9 +53,9 @@ void BezierCurve::render(const triple *p, bool straight) append(); } -// Use a uniform partition to draw a Bezier patch. +// Use a uniform partition to draw a Bezier curve. // p is an array of 4 triples representing the control points. -// Ii are the vertices indices. +// Ii are the vertex indices. void BezierCurve::render(const triple *p, GLuint I0, GLuint I1) { triple p0=p[0]; @@ -62,7 +81,8 @@ void BezierCurve::render(const triple *p, GLuint I0, GLuint I1) triple s0[]={p0,m0,m3,m5}; triple s1[]={m5,m4,m2,p3}; - GLuint i0=data.vertex1(m5); + triple n0=normal(bezierPh(p0,p1,p2,p3),bezierPPh(p0,p1,p2,p3)); + GLuint i0=data.vertex(m5,n0); render(s0,I0,i0); render(s1,i0,I1); |