Rysowanie sieci 3d - bryły Archimedesa

12

Mam słabość do sieci 3d, które po wycięciu i złożeniu umożliwiają tworzenie kształtów 3d z papieru lub karty. Zadanie jest proste, napisano najkrótszy program, który rysuje sieci dla 13 brył Archimedesa. Wyjście powinno być plikiem obrazu w dowolnym rozsądnym formacie (png, jpg).

Wszystkie trzynaście kształtów zostało opisanych na stronie http://en.wikipedia.org/wiki/Archimedean_solid oraz w poniższej tabeli pobranej z tego miejsca.

wprowadź opis zdjęcia tutaj

Dane wejściowe: Liczba całkowita od 1 do 13. Załóżmy, że kształty są ponumerowane dokładnie tak, jak w powyższej tabeli, tak że „czworościan ścięty” ma numer 1, a „dwunastościan” ma numer 13.

Dane wyjściowe: plik obrazu zawierający siatkę dla tego kształtu. Tylko kontur zawierający linie wewnętrzne jest OK. Nie trzeba wypełniać go kolorami

Możesz używać dowolnego języka programowania, który Ci się podoba, a także dowolnej biblioteki, która nie została stworzona specjalnie na potrzeby tego konkursu. Oba powinny być dostępne bezpłatnie jednak (w obu aspektach) online.

Przyjmę odpowiedź z najmniejszą liczbą znaków dokładnie za tydzień. Odpowiedzi będą akceptowane za każdym razem, gdy się pojawią.

(Nie) Zwycięzca jeszcze. Niestety nie ma ważnych uczestników. Może to jest zbyt trudne?

Felipa
źródło
Może całkowicie zlikwidujesz termin? Co jeśli ktoś znajdzie to za rok. Czy chcesz, żeby nie próbowali? ... Może lepiej byłoby najpierw zrobić platoński, poczekaj, a potem trudny. Być może podzieliłeś odsetki. Dla mnie osobiście (wszystko to jest ekstrapolacja), gdy zobaczyłem dwa podobne, wycofałem się z tego, czując, że nie mam czasu, aby naprawdę spojrzeć na oba i zaplanować, jak rozwiązać oba. I nie chciałbym tego robić w żaden inny sposób ... Z drugiej strony inni tutaj mieli trudności z wyzwaniami z Części 2. Zobacz te Minsky Register Machine. Może to nie ty.
luser droog
@luserdroog Thanks. Pytanie edytowane. Powinienem dodać, że wysłałem odpowiedź e-mailem na pokrewne pytanie wokół wielu osób, które ją uwielbiają! FWIW.
felipa
Nie sądzę, że jest to trudne do zrobienia , ale do golfa to wymaga kilku godzin myślenia i eksperymentowania, ponieważ istnieje wiele możliwych siatek dla każdego wielościanu i nie będą ściskać równie dobrze.
Peter Taylor

Odpowiedzi:

9

Java, 1552

import java.awt.*;import java.awt.image.*;import java.io.*;import javax.imageio.*;class
A{public static void main(String[]x)throws
Exception{String[]a={"33623368356:356;66","33413341334535463547354735473444","33823382338:3586338>358>358>358?88","66456:466:466845684668466766","334144453546354635474746464646464647354634463446344744","88456:466:466:4668458<468<468<468:456846684668466788","33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444","33513351335233593554335433593554335935543359355433593559355835593559355935593455","33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::","66566:576:57696869576969586969586:586969576969586857685868586766","334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755","::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::","333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};BufferedImage
m=new BufferedImage(1300,1300,1);Graphics2D g=m.createGraphics();g.translate(500,500);String
s=a[Integer.valueOf(x[0])-1];int f=1,i=0,n,t;while(i<s.length()){n=s.charAt(i++)-48;t=s.charAt(i++);while(t-->48){g.drawLine(0,0,20,0);g.translate(20,0);g.rotate(f*Math.PI*2/n);}f=-f;}ImageIO.write(m,"png",new File("o.png"));}}

Nie golfowany:

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class A {
    static int f = 1;
    static Graphics2D g;

    static void fixtrans() {
        double[] m = new double[6];
        g.getTransform().getMatrix(m);
        for (int i = 0; i < 6; ++i) {
            if (Math.abs(m[i] - Math.round(m[i])) < 1e-5) {
                m[i] = Math.round(m[i]);
            }
        }
        g.setTransform(new AffineTransform(m));
    }

    static void d(String s) {
        for (int i = 0; i < s.length();) {
            int n = s.charAt(i++) - '0';
            int t = s.charAt(i++) - '0';
            for (int j = 0; j < t; ++j) {
                g.drawLine(0, 0, 20, 0);
                g.translate(20, 0);
                g.rotate(f * Math.PI * 2 / n);
                fixtrans(); // optional, straightens some lines
            }
            f = -f;
        }
    }

    public static void main(String[] args) throws Exception {
        String[] a = {
                "33623368356:356;66",
                "33413341334535463547354735473444",
                "33823382338:3586338>358>358>358?88",
                "66456:466:466845684668466766",
                "334144453546354635474746464646464647354634463446344744",
                "88456:466:466:4668458<468<468<468:456846684668466788",
                "33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444",
                "33513351335233593554335433593554335935543359355433593559355835593559355935593455",
                "33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::",
                "66566:576:57696869576969586969586:586969576969586857685868586766",
                "334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755",
                "::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::",
// bad          "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353531333459343434355935323335345935323335345935323335345935323335345935353455"
                "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};

        BufferedImage img = new BufferedImage(1300, 1300, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics();
        g.translate(500, 500);
        d(a[Integer.parseInt(args[0]) - 1]);
        String f = args[0] + ".png";
        ImageIO.write(img, "png", new File(f));
    }
}

Wyniki (przycięte, zanegowane, połączone i skalowane):

wyniki

Kształty są dość nietypowe :), ale o ile mogę powiedzieć, są poprawne (daj mi znać, jeśli znajdziesz jakieś błędy). Zostały one wygenerowane (w osobnym programie) przez zbudowanie wykresu powierzchni i cykli cięcia w DFS.

Jestem pewien, że można grać w golfa o wiele więcej, używając np. Pytona i żółwia.

Edycja: ups, ostatni przypadek był trochę przecinający się. Naprawiłem kod (ręcznie), oto zaktualizowany obraz:

13 poprawione

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
Czy poprawka ręcznie oznacza, że ​​kod nadal wyświetla skrzyżowanie? Czy to jedyna rzecz, która odróżnia to od prawidłowej odpowiedzi?
trichoplax
@githubphagocyte Jeśli nadal generowałoby samo-skrzyżowanie, nie byłoby to poprawką. To jest poprawna odpowiedź.
Aditsu odeszło, ponieważ SE to EVIL
Zostało to zgłoszone, ponieważ narusza jedną z zasad w naszym centrum pomocy : wszystkie rozwiązania problemów powinny [...] poważnie konkurować z zastosowanymi zwycięskimi kryteriami. Na przykład należy wziąć udział w turnieju golfowym.
Dennis
@Dennis lepiej teraz, mr. policjant? : p
zakończono aditsu, ponieważ SE to EVIL
6

Matematyka

Poza konkurencją, nie jest to wolny język

f[n_] := PolyhedronData[Sort[PolyhedronData["Archimedean", 
                                             {"FaceCount", "StandardName"}]][[n, 2]],  "NetImage"]

Stosowanie:

f /@ Range@13

Grafika matematyczna

Dr Belizariusz
źródło