20 Stimmen

Gleichungsgesteuerte gleichmäßig schattierte konzentrische Formen

Hintergrund

Ich möchte interessante Videoübergänge (in Graustufen) erstellen.

Problem

Gegeben Gleichungen die eine geschlossene, symmetrische Form darstellen, zeichnen Sie den Umriss ein und schattieren Sie die Form konzentrisch in Richtung ihres Mittelpunkts.

Beispiel

Betrachten Sie die folgenden Gleichungen:

x = 16 * sin(t)^3
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
t = [0:2 * pi]

Wenn gezeichnet:

Wenn es schattiert ist, sieht es so aus (nicht vollständig schattiert dargestellt, aber ausreichend, um die Idee zu verdeutlichen):

Beachten Sie, dass die Schattierung an der Außenseite am dunkelsten ist (z. B. #000000 RGB hex) und dann heller wird, wenn sie sich zur Mitte hin füllt. Die Mitte wäre ein weißer Punkt (z. B. #FFFFFF).

Fragen

  1. Wie lassen sich hochauflösende, konzentrisch schattierte Graustufenbilder, wie das schattierte Herz oben, am zweckmäßigsten erstellen?
  2. Wie nennt man solche geschlossenen, symmetrischen Formen formal?

Ich danke Ihnen!

Ideen

  • Verwenden Sie eine Bibliothek wie http://code.google.com/p/jmathplot/
  • GNUPlot verwenden
  • R verwenden
  • Plotten mit Wolfram Alpha, ImageMagick verwenden, um kleinere konzentrische Versionen zu erstellen

32voto

James Punkte 63228

Versuchen Sie dies in R:

# create palette
greyScale <- colorRampPalette(c("black","white"))

# function to draw shape
plotHeart <- function(r, col){
  t <- seq(0,2*pi,length.out=100)
  x <- r*sin(t)^3
  y <- (13*r/16)*cos(t) - (5*r/16)*cos(2*t) - (2*r/16)*cos(3*t) - (r/16)*cos(4*t)
  polygon(x,y,col=col,border=NA)
}

# create new plot canvas
plot.new()
# limits are approximate here
plot.window(xlim=c(-16,16),ylim=c(-16,13))

# use mapply to loop
mapply(plotHeart,seq(16,0,length.out=100),greyScale(100))

Daraus ergibt sich:

Filled heart plot

Dies funktioniert durch wiederholtes Übereinanderlegen von gefüllten Polygonen mit abnehmender Größe und unterschiedlicher Farbe. Um Ihre Fragen zu beantworten:

(1) Dies wurde von meinem Rechner (einem bescheidenen Core 2 Duo Laptop) in 0,09 Sekunden erzeugt. Es mag andere Sprachen/Implementierungen geben, die schneller sind, aber mir scheint dies schnell genug zu sein.

(2) Eine ebene Form, die aus Linien besteht, die sich nicht kreuzen, wird gewöhnlich als einfaches Polygon bezeichnet.

1voto

trashgod Punkte 199887

使用方法 2D-Grafiken diese Beispiel ändert die Transparenz der konzentrischen Kreise mit drawOval() um einen ähnlichen Effekt zu erzielen, aber der Ansatz kann erweitert werden auf draw() jede Klasse, die die Shape Schnittstelle. Die createTransformedShape() Methode der AffineTransform kann verwendet werden, um den Umriss konzentrisch zu verschieben und zu skalieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X