# How to smooth the corner joining the end point of a Bezier curve and the start point of an elliptical arc?

The following figure shows the problem. The corners that are magnified should be smooth (not smooth defined in mathematics).

I have changed liftpen from 0 to 2, but the problem still exists.

How to smooth the corners?

\documentclass{article}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{pspicture}
\PreviewBorder=15pt

\psset{unit=1.5cm}
\begin{document}
\begin{pspicture}[showgrid=false](-7,-5)(7,5)
\psellipse[fillstyle=solid,opacity=0.75,fillcolor=yellow](0,0)(7.0,4.3)
\psellipse[linewidth=0.5,dimen=middle](0,0)(6.5,3.8)
\def\left{
\pscustom*[fillstyle=solid,linewidth=0.1]{
\psline(0,2.7)(0.5,2.7)(1,3.25)
\psbezier(1.2,1.3)(1.3,1.0)(2.0,1.0)
\psbezier(3.0,1.0)(3.0,2.2)(2,3.1)
% How to smooth the corner between the previous path and the next path?
\psellipticarcn(0,0)(6.0,3.3){!3.1 2 atan}{!-2.8 3.2 atan}
\psbezier(4,-2)(4,0)(2.2,-1.8)
\psbezier(1.5,-1)(1,-1)(0,-3.2)
}}\left
\psscalebox{-1 1}{\left}
\end{pspicture}
\end{document}
• are you looking for the optional argument linejoin=1 ?
– user2478
Mar 10, 2012 at 19:13
• You have a problem with your path as Werner already pointed out. The end of \psbezier and the beginnung of \psellipticarc is connected by a line!
– user2478
Mar 11, 2012 at 6:39
• @Damian: I do not understand what you mean? \psbezier needs four points. Only in \pscustom the first one is the current point.
– user2478
Mar 11, 2012 at 7:10
• @Damin: sure, you can take the last point for calculating the start angle, but your last point of \psbezier is inside the elliptic arc, the reason why you always have to connect the points.
– user2478
Mar 11, 2012 at 7:31
• @Damin: Again: that is not the source of the problem. The source is your last point which is inside the elliptic arc and not on the arc.
– user2478
Mar 11, 2012 at 10:57

One approach is to group lines and curves within a \pscustom command: all the pieces now form a unique line. For example

\documentclass{standalone}

\begin{document}
\begin{pspicture}(0,0)(2,2)

\psline[linecolor=red](0,0.5)(1,1.5)
\psline[linecolor=red](1,1.5)(0,1.5)

\pscustom{
\psline(0,0)(1,1)
\psline(1,1)(0,1)
}

\end{pspicture}
\end{document

The result is

• There is no need for \pscustom, linejoin does it already
– user2478
Mar 10, 2012 at 19:14
• @Herbert: Can you please include an example of linejoin that is not within \pscustom. My understanding of the documentation requires that setting to be specified for use in a \pscustom command. This can be done in two ways: in a \codecommand with the PostScript setlinejoin or by redefining some commands. Either way, the simplest approach is to just place things within a \pscustom command. Mar 10, 2012 at 22:04
• @Frédéric: there is a misunderstanding: I meant that in your example a \psline(0,0)(1,1)(0,1) would already use an internal setting of linejoin
– user2478
Mar 11, 2012 at 6:36
• @Damian: no reason to downvote it ...
– user2478
Mar 11, 2012 at 8:26
• @Herbert: Thanks for your comment. I had kept the two line segments separate to show what \pscustom does. Mar 11, 2012 at 21:37

The clipping path of \psellipticarc[n] (I think) does not properly join with the former constructs. Otherwise, including linejoin=1 as part of your \pscustom options (see section L.8 Line connections, p 304 of the pstricks documentation). Here I've just extended the \psbezier to line up with \psellipticarcn better, causing the illusion that it worked. Herbert will be able to find out what the actual problem is, I'm sure:

\documentclass{article}
\usepackage[active,tightpage]{preview}% http://ctan.org/pkg/preview
\PreviewEnvironment{pspicture}
\PreviewBorder=15pt

\psset{unit=1.5cm}
\begin{document}
\begin{pspicture}[showgrid=false](-7,-5)(7,5)
\psellipse[fillstyle=solid,opacity=0.75,fillcolor=yellow](0,0)(7.0,4.3)
\psellipse[linewidth=0.5,dimen=middle](0,0)(6.5,3.8)
\def\left{%
\pscustom*[fillstyle=solid,linewidth=0.1]{%
\psline(0,2.7)(0.5,2.7)(1,3.25)
\psbezier(1.2,1.3)(1.3,1.0)(2.0,1.0)
\psbezier(3.0,1.0)(3.0,2.2)(2,3.1112)% Modified last coordinate from (2,3.1)
\psellipticarcn(0,0)(6.0,3.3){!3.1 2 atan}{!-2.8 3.2 atan}
\psbezier(4,-2)(4,0)(2.2,-1.8)
\psbezier(1.5,-1)(1,-1)(0,-3.2)
}%
}%
\left
\psscalebox{-1 1}{\left}% right
\end{pspicture}
\end{document}

Based on Herbert's comment in many places, here is the solution:

Pass correctAngle=false,dimen=middle options to \psellipticarcn and make the last point of Bezier coincide with the first point of elliptic arc.

\documentclass{article}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{pspicture}
\PreviewBorder=15pt

\begin{document}
\begin{pspicture}[showgrid=false](-7,-5)(7,5)
\psellipse[fillstyle=solid,opacity=0.75,fillcolor=yellow](0,0)(7.0,4.3)
\psellipse[linewidth=0.5,dimen=middle](0,0)(6.5,3.8)
\def\left{
\pscustom[fillstyle=solid,linewidth=2pt,linecolor=red,fillcolor=black]{
\psline(0,2.7)(0.5,2.7)(1,3.25)
\psbezier(1.2,1.3)(1.3,1.0)(2.0,1.0)
\psbezier(3.0,1.0)(3.0,2.2)(!76 cos 6 mul 76 sin 3.3 mul)
\psellipticarcn[correctAngle=false,dimen=middle](0,0)(6.0,3.3){76}{-76}
\psbezier(4,-2)(4,0)(2.2,-1.8)
\psbezier(1.5,-1)(1,-1)(0,-3.2)
}}\left
\psscalebox{-1 1}{\left}
\end{pspicture}
\end{document}