Benutzerdefinierte, platzsparende Ellipse als TikZ-Knotenform?

Benutzerdefinierte, platzsparende Ellipse als TikZ-Knotenform?

In manchen Anwendungen möchte man Ellipsen als Knotenformen in Abbildungen verwenden, z. B. wenn in der Literatur zu einem Thema typischerweise Ellipsen verwendet werden, um bestimmte Dinge in Abbildungen zu kennzeichnen. Das Problem mit normalen Ellipsen ist, dass sie oft viel Platz verschwenden:

https://i.stack.imgur.com/0wAeX.png

Wenn eine Figur bereits sehr breit ist, können die großen „Endkappen“ am linken und rechten Ende der Ellipse sehr störend sein, da sie etwas Platz verbrauchen. Es wäre schön, wenn es einen anderen Knotenformtyp gäbe, der immer noch rund, aber platzsparender ist. Mit flacheren Endkappen kann eine Ellipse um einen Text herum eine geringere Breite haben:

https://i.stack.imgur.com/0wAeX.png

Die erste dieser Ellipsen ist noch eine normale, die anderen sind jedoch etwas „verformt“. Sie sind jedoch noch immer als Ellipsen erkennbar (obwohl sie strenggenommen keine sind).

Der Prozess zum Erstellen benutzerdefinierter Knotenformen hierfür übersteigt meinen Horizont ein wenig, insbesondere da die Mathematik, die zum Berechnen der richtigen Grenzen für einen Knotenkontext erforderlich wäre, in Tikz wahrscheinlich zu kompliziert ist.

Hier ist der Python-Code, den ich zum Erstellen dieser Beispiele verwendet habe: Man kann sehen, dass die Verwendung einer Exponentialfunktion den Zweck erfüllt. Aber um die Knotenform in der Praxis zu verwenden, ist es wahrscheinlich etwas wichtiger, die Funktion zum Zeichnen solcher Formen in LaTeX selbst zu haben.

#!/usr/bin/python
import math

def moreimpact(x,base):
    if x<0:
        return -math.pow(-x,base)
    else:
        return math.pow(x,base)

print "\\documentclass{article}"
print "\\usepackage{tikz}"
print "\\usetikzlibrary{shapes}"
print "\\begin{document}"
print "\\begin{tikzpicture}"
print "\\node[draw,shape=ellipse,inner sep=1pt] (f1) at (0,2) {This is a long text that leads to a very large ellipse};"

for j in xrange(0,4):
    print "\\draw",
    for i in xrange(0,360):
        if i!=0:
            print " -- ",
        xpos = math.cos(i/180.0*math.pi)
        ypos = math.sin(i/180.0*math.pi)
        print "(%f,%f)" % (5*moreimpact(xpos,1.0-0.1*j),0.3*moreimpact(ypos,1.0-0.1*j)-j*1.2),
    print " -- cycle;"
print "\\end{tikzpicture}"
print "\\end{document}"

Weiß jemand, wie man für eine solche „komprimierte Ellipse“ oder etwas Ähnliches in TikZ eine neue Knotenform definiert (optimal parametrisiert durch das, was ich im obigen Code „Auswirkung“ genannt habe)? Die Antwort ist wahrscheinlich für viele Leute hilfreich, da ich denke, dass diese Knotenform in Situationen recht nützlich ist, in denen wenig Platz für eine Figur vorhanden ist (z. B. Präsentationen) und Rechtecke oder Rechtecke mit abgerundeten Ecken bereits zur Bezeichnung von etwas anderem verwendet werden.

BEARBEITEN:Qrrbrbirlbel hat einen Link zu einem Beitrag über eine „Superellipse“ bereitgestellt, der Code für eine neue TikZ-Knotenform namens „Superellipse“ enthält. Das ist genau das, was gefragt wurde. Es ist nur schade, dass die Größenberechnung nicht wirklich funktioniert:

\node[shape=superellipse,superellipse parameter=3] at (2,3) {This is a long text that leads to a very large ellipse};

Ein Knoten, der zu groß ist

Dies kann durch das Hinzufügen von Negativzeichen umgangen werden, es handelt sich jedoch nur um eine Problemumgehung.

Antwort1

Aus den Kommentaren: Ein negativer inner sepWert für Jakes superellipseForm ist eine Möglichkeit. Aber Sie können die Tasten text heightund auch text depthabsichtlich auf niedrigere Werte setzen und damit durchkommen.

Viele andere Dinge hängen von inner sepWerten ab, daher ist ein negativer Wert ein Garant für Probleme.

verwandte Informationen