Short of defining a new shape, here's a cheaty version with another circle node around it.
For this, I'll add the anchor semicircle center
to the shape which always sits in the middle of the chord, independently of the outer sep.
This allows you to place the shape on the semicircle center
without changing the outer seps.
Then we add another circle
node that has the same (outer) radius as the semicircle. This gets the same name as the semicircle but with a '
added.
Technically, we could extract the radius from the shape itself but the through
library makes it very easy. (It measures the distance between the at
and the through
point and sets that as the minimum size
of the node.)
Code
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric, through}
\makeatletter
\pgfutil@namedef{pgf@anchor@semicircle@semicircle center}{%
\pgfpointadd{\pgf@sh@reanchor{semicircle}{chord center}}{%
\installsemicircleparameters\pgfpointpolar{\rotate+90}{\outersep}}}
\makeatother
\tikzset{
circle around semi/.style={
append after command={[every node/.code=]%
node[at=(\tikzlastnode.semicircle center),
circle through=(\tikzlastnode.apex), overlay,
anchor=center, name=\tikzlastnode', inner sep=+0pt, outer sep=+0pt,
path only]{}}}}
\begin{document}
\begin{tikzpicture}[ultra thick]
\node [
semicircle, circle around semi, draw,
shape border rotate=180,
anchor=semicircle center,
inner sep=0.2cm
] (a) at (1,1) {};
\draw[red] (0,0) -- (a');
\end{tikzpicture}
\tikz\draw[ultra thick]
(0,0) .. controls +(30:1) and +(135:2) .. (2,2)
foreach[count=\i from 0, evaluate=\i as \c using \i/4*100]
\pos in {.125, .333, .5, .75, .95}{
node[fill=red!\c!blue, draw=blue!\c!red, fill, thin, sloped,
semicircle, circle around semi, pos=\pos, anchor=semicircle center](@){}
(@') foreach \ang in {0,15,...,359}{edge[thin] ++(\ang:.3)}
};
\end{document}
Output


center
anchor. In this case you should be able to use(a.225)
instead. Anything more automatic will be a shape-dependent solution including some calculation. Alternatively, you could as hidden circle node with it's center ata.north
and use that instead ofa
. Again, an automatic approach would have to figure out on which side of the semicircle the line needs to be connected to.