Druckdaten für Weltkugel aus 2d-Vorlage erstellen

Ok, das hört sich schwierig an.
Das Problem mit dem "Bildanfang/-ende" ist klar.
Das die Segmente nicht mehr aneinander liegen wäre kein Problem, da ich sie eh einzeln ausgeschnitten habe.
Schade, ich dachte, vielleicht wäre es unkomplizierter :rolleyes:

Edit: Oh, das ging ja schnell! Werde ich gleich mal ausprobieren. Melde mich dann, obs geklappt hat :clap:
 
ui, ich bekomme einige Fehlermeldungen:
Code:
ImagePad::imgpadn: Expecting a number or a 2 by 2 matrix of numbers instead of {{1-Min[Floor[1. +Clip[Max[<<2>>],{<<2>>}]],Floor[1. +Clip[Min[<<2>>],{<<2>>}]]],-1000+Max[Floor[1. +Clip[Max[Times[<<2>>],Times[<<2>>]],{0.0001,1000.}]],Floor[1. +Clip[Min[Times[<<2>>],Times[<<2>>]],{0.0001,1000.}]]]},{-500+Max[Floor[501. -Clip[Max[<<2>>],{<<2>>}]],Floor[501. -<<1>>]],1-Min[<<1>>,<<1>>]}}. >>

Habe ich etwas übersehen? :rolleyes:

Mein Beispielbild: Bild.jpgTransformiertesBild.jpg
 
Da habe ich beim Kopieren anscheinend zwei kleine Zeilen Code vergessen. Habe sie oben ergänzt.
 
WOW, wirklich toll! :drum:

Ich habe noch den Hintergrund geändert, um Druckerpatrone zu sparen und beim Ausschneiden im Zweifelsfall keine schwarzen Ränder zu erhalten :p

Code:
Bild = Import["Bild.png"];

NumSegmente = 24;
Überlapp = 1/30;

dimx = ImageDimensions[Bild][[1]];
dimy = ImageDimensions[Bild][[2]];

BildListe = {};

For[i = 2, i <= (NumSegmente - 1), i++, 
  BildListe = 
    Append[BildListe, 
     ImageTrim[
      Bild, {{(i - 1 - Überlapp)/NumSegmente*dimx, 
        0}, {(i + Überlapp)/NumSegmente*dimx, dimy}}]];];

BildListe = 
  Insert[BildListe, 
   ImageAssemble[{ImageTrim[
      Bild, {{(NumSegmente - Überlapp)/NumSegmente*dimx, 0}, {dimx, 
        dimy}}], 
     ImageTrim[
      Bild, {{0, 0}, {(1 + Überlapp)/NumSegmente*dimx, dimy}}]}], 1];
BildListe = 
  Append[BildListe, 
   ImageAssemble[{ImageTrim[
      Bild, {{(NumSegmente - 1 - Überlapp)/NumSegmente*dimx, 
        0}, {dimx, dimy}}], 
     ImageTrim[Bild, {{0, 0}, {(Überlapp)/NumSegmente*dimx, dimy}}]}]];

BildListeTransform = {};

For[i = 1, i <= Length[BildListe], i++, TeilBild = BildListe[[i]];
  aspect = ImageAspectRatio[TeilBild];
  fun[x_, y_] := {1/2 + Cos[(y/aspect - 1/2)*Pi]*(x - 1/2), y};
  BildListeTransform = 
   Append[BildListeTransform, 
    ImageForwardTransformation[TeilBild, fun[#[[1]], #[[2]]] &, 
     Interpolated -> False, Background -> Lighter[LightGray, .8]]];];

TransformiertesBild = ImageAssemble[BildListeTransform]

Export["TransformiertesBild.png", TransformiertesBild];


Wo wir gerade dabei sind :d
Wäre es möglich das zwischen den Segmenten etwas Abstand ist, dann kann man sie besser ausschneiden.
So ist es schwer zu finden wo ein Segment anfängt und das andere aufhört. - Ist aber eher ein kleiner Zusatz.


Großes Dankeschön fürs Überlappen! :cake:
 
Sicher geht das, einfach am Ende "TransformiertesBild = Grid[{BildListeTransform}, Spacings -> 1/5]" an Stelle von "TransformiertesBild = ImageAssemble[BildListeTransform]" verwenden. "Spacings" kontrolliert den Abstand, einfach so wählen, dass es passt.
 
^^Den Abstand probiere ich gleich mal aus :)

Leider habe ich doch noch ein kleines Problem gefunden.
Besonders in den Spitzen ist das Überlappen sehr hilfreich, da dort häufig Lücken entstehen.
Bei der aktuellen Überlappung ist es kein fester Rand, sondern anteilig zum Segment. Sodass in Richtung Spitzen immer weniger bzw. am Ende keine Überlappung mehr ist. :(
Müsste es nicht etwa so aussehen, zb. ein 2mm Rand nach links und recht:
(Grobe gebastelte Skizze) 2mm rand.jpg
 
Bei der aktuellen Überlappung ist es kein fester Rand, sondern anteilig zum Segment. Sodass in Richtung Spitzen immer weniger bzw. am Ende keine Überlappung mehr ist.

Müsste es nicht etwa so aussehen, zb. ein 2mm Rand nach links und recht:

Nein, das ist korrekt so. In der Ausgangskarte verlaufen horizontale Linien entlang eines Breitengrades und vertikale Linien entlang eines Längengrades, sodass die Streifen immer mehr gestaucht werden müssen, je weiter man nach Norden bzw. Süden kommt. Das betrifft auch den Überlapp, denn ich habe einfach nur die Streifen etwas breiter gewählt als sie eigentlich sein müssten, sodass ein Überlapp von 2mm am Äquator nur noch 2mm * cos(phi) (wobei phi der Breitengrad ist) breit ist, wenn man zum Breitengrad phi geht (an den Polen hat man daher auch keinen Überlapp, da cos(pi/2)=0). Das ist anders nicht zu machen.

Wenn du zu den Polen hin mehr Überlapp willst, würde ich vorschlagen einfach mehr Überlapp einzustellen. Beim Äquator hast du dann vermutlich zu viel Überlapp, aber den kann man dann ja einfach wegschneiden.
 
Hm, habe ein bisschen mit rum probiert. Aber ich sehe da noch keine passende Lösung :rolleyes:
Wenn ich die Überlappung weit einstelle und mit der Schere in der Segmentemitte wieder beschneide, wird das ganze sehr ungleichmäßig, da es ja frei Hand ist. Ausserdem bleibt das Problem, dass es an den Polen Lücken entstehen, da auf den letzten Zentimetern die Überlappung fehlt.
Hier noch mal verdeutlicht: 2.jpg

So ist es zur Zeit: 1.jpg und so wäre es optimal, sozusagen eine Beschnittzugabe (von einem gleichmäßigen Rand links & rechts): 0.jpg

Wie man das macht, sodass die Kugelform/Verzerrung weiterhin berücksichtigt wird, keine Ahnung :confused:
Vielleicht hast du ja noch eine Idee? :)

Viele Grüße
 
Ausserdem bleibt das Problem, dass es an den Polen Lücken entstehen, da auf den letzten Zentimetern die Überlappung fehlt.

Das ist mir klar, auf nichts anderes habe ich ja bereits hingewiesen.

Vielleicht hast du ja noch eine Idee?

Du könntest aus zwei wagerechten Streifen vom oberen und unteren Rand zwei Kreise mit den (korrekt dargestellten) Polregionen erzeugen. Die könntest du dann an der passenden Stelle über die Segmente kleben, dann wäre der mangelnde Überlapp der darunterliegenden Teile der Segmente kein Problem mehr.
 
ok, ich probiere es mal am Objekt aus :d
Kann 1-2 Tage dauern, ist immer recht aufwendig das ausschneiden und bekleben.
Die Idee ggf runde Kreise auf die Pole zu kleben, ist auch gut!
Die Pole sind durch die vielen Schnittstellen sowieso ein bisschen die Schwachstellen.
Danke noch mal - Melde mich wieder wie es geklappt hat :)
 
@Jean: Erst wenn alles schief geht ;)

@Texnician: Habe leider mit der Zeile noch Probleme, sonst läuft alles:
Code:
TransformiertesBild = Grid[{BildListeTransform}, Spacings -> 1/3]
Egal welche Auflösung mein Bild hat, das exportierte PNG hat immer eine Höhe von 218px?! :confused:
Habe schon Diverses in der Dokumentation nachgeschlagen.
Finde aber nicht woran es liegt? :rolleyes:
 
Bitte folgenden Code verwenden:

Code:
TransformiertesBild = Grid[{BildListeTransform}, ItemSize->Full,BaseStyle -> ImageSizeMultipliers -> 1]

Ansonsten klappt es bei mir so wie es soll...
 
Toll! :music: Nun klappt es! Großartig und danke noch mal! :cake:
 
Hallo ich bin neu hier im Forum. Habe diesen Thread nach langem suchen endlich gefunden. Und schön das es mal einer auf Deutsch ist. Macht es doch ein bisschen einfacher. Nun ich habe ähnlich wie die meine Vorgänger ein Problem zu einem Studienprojekt. Ich habe mittlerweile mehr Zeit in die Suche nach einer Möglichkeit der Umsetzung gefunden als in die Grafische Ausarbeitung des Projekts. Ich habe mir die vorigen Posts alle Durchgelesen und mir ist aufgefallen, dass ich diesen Thread schon mal gefunden habe. Nur hat sich seitdem einiges getan.

Ich habe wie TEXnician beschreibt mein Bild im 1:2 Format und als Png in Mathematica eingefügt. Den Code danach platziert. Oder den Code 1. platziert und dann das Bild.png durch mein Bild ausgetauscht. Aber es passiert irgendwie nie etwas.

Meine Fragen:
- Gehe ich das ganze komplett falsch an? (Ich hab mir Mathematica als Demoversion runtergeladen und kenn mich mit dem Programm 0 % aus)
- Muss ich nachdem ich den Code eingefügt habe warten? Exportieren? Es geschieht nämlich nichts. (Ich habe mir gedacht es wäre evtl. so wie Dreamwaeaver, wo man zwischen einer Code und Bildansicht wechseln kann.
- Es muss kein Png sein oder? Kann auch ein Psd o.ä. sein? Ich benötige am Ende eine qualitativ hochwertige Druckdatei mit 300Dpi, die eine Kugel mit dem
Durchmesser von 24,5 umhüllen kann.

Wäre jedem der mir helfen kann SEHR dankbar. Ich dreh noch komplett am Rad.
 
Es wäre natürlich gut zu wissen, welche Version von Code du ausgeführt hast. Hier mal meine (korrigierte, siehe oben) erste Version:

Code:
Bild = Import["Bild.png"];
aspect = ImageAspectRatio[Bild];
NumSegmente = 48;
fun[x_, y_] := {IntegerPart[NumSegmente*x]/NumSegmente + 1/(2*NumSegmente) + Cos[(y/aspect - 1/2)*Pi] * (FractionalPart[NumSegmente*x] - 1/2) / NumSegmente, y};
TransformiertesBild = ImageForwardTransformation[Bild, fun[#[[1]], #[[2]]] &, Interpolated -> False];
Export["Mond.png", TransformiertesBild]

Der Code lädt das Ausgangsbild "Bild.png", das im aktuellen Arbeitsverzeichnis (also standardmäßig deinem Home-Verzeichnis) liegen muss. In der Zeile "NumSegmente = 48;" kann man die Anzahl der Kugelsegmente angeben. In diesem Fall wären es also 48, aber weniger ist natürlich auch möglich. Das Ergebnis wird am Ende als "Mond.png" exportiert (und wieder im aktuellen Arbeitsverzeichnis gespeichert). So wie der Code da steht, gibt er nur am Ende einmal den Namen der exportierten Datei aus (wenn erfolgreich).
Und ja, es kann auch ein anderes Bildformat sein, das Mathematica exportieren/importieren kann (die Hilfe hilft), psd-Dateien sind allerdings nicht möglich (weder im Im- noch Export), da das im wissenschaftlichen Bereich nicht gerade weit verbreitet ist, png oder tiff (usw.) reichen für reine Bilddaten vollkommen aus.

Zu der Bilddatei: Bei 300 dpi und 24,5 cm Durchmesser sollte das Bild rund 9090 Pixel breit (und entsprechend die Hälfte hoch) sein. Als Ergebnis kommt übrigens ein Bild mit den gleichen Dimensionen heraus wie am Anfang importiert wurde. Man kann es natürlich (in Mathematica) hochrechnen lassen, allerdings dann unter Umständen mit entsprechenden Qualitätsverlusten, also Vorsicht.
 
Zuletzt bearbeitet:
Hallo und danke für die Blitz Antwort :). Ich habe jetzt den eben geposteten Code eingefügt. Ich probiere das gerade noch einmal aus. Mich hat nur etwas Limonas angehängtes Bild unten verwirrt. Wo es so aussieht als ob durch den Code irgendwelche Aktionen mit dem Bild passiert sind... Das umrechnen dauert ziemlich lange ne?
Anhang anzeigen 131925
 
Das umrechnen dauert ziemlich lange ne?

Ja, kann etwas dauern. Dir steht es natürlich frei effizienteren Code zu schreiben bzw. die Funktion sinngemäß zu invertieren und die Rückwärtstransformation zu verwenden (die wesentlich effizienter ist).
 
Zurück
Oben Unten