2012-01-11 10 views

Odpowiedz

10

nie jestem zaznajomiony z problemem, ale do tworzenia diagramów z prymitywów, które wyglądają trochę jak te, które zostały wklejone, można to zrobić:

początek z „bazowej” sprawy -

base = {Circle[{-0.4, 0.4}, 0.1], Disk[{0, .125}, 0.05], 
    Text[Style["1", 24], {0, -0.1}], 
    Disk[{0.5, .125}, 0.05], Text[Style["2", 24], {0.5, -0.1}], 
    Disk[{1., .125}, 0.05], Text[Style["3", 24], {1., -0.1}], 
    Circle[{.5, 0}, {.9, .5}]}; 

Graphics[{base}, ImageSize -> 220] 

enter image description here

Stąd wystarczy dodać elips do przypadku bazowego:

Graphics[{base, Circle[{0, 0}, {.15, .3}]}, ImageSize -> 220] 

enter image description here

Graphics[{base, Circle[{0, 0}, {.15, .3}], 
    Circle[{0.5, 0}, {.15, .3}], Circle[{0.25, 0}, {.58, .38}]}, 
ImageSize -> 220] 

enter image description here

Graphics[{base, Circle[{0.5, 0}, {.15, .3}], 
    Circle[{0.25, 0}, {.58, .38}], Circle[{0.75, 0}, {.58, .38}]}, 
ImageSize -> 220] 

enter image description here

Graphics[{base, Circle[{0.5, 0}, {.15, .3}], 
    Circle[{1, 0}, {.15, .3}], Red, AbsoluteThickness[6], 
    Line[{{-0.4, -0.5}, {1.4, 0.55}}], 
    Line[{{-0.4, 0.55}, {1.4, -0.5}}]}, ImageSize -> 220] 

enter image description here

Graphics[{base, Circle[{0.25, 0}, {.58, .38}], 
    Circle[{0.75, 0}, {.58, .38}], Red, AbsoluteThickness[6], 
    Line[{{-0.4, -0.5}, {1.4, 0.55}}], 
    Line[{{-0.4, 0.55}, {1.4, -0.5}}]}, ImageSize -> 220] 

enter image description here

Zwróć uwagę, że ustawiam klatkę-> prawda podczas ich poprawiania, aby móc zobaczyć współrzędne.

+0

Szukam programowo wygenerować obraz dla zmiennej liczby punktów. Myślę, że mogę to uogólnić, dziękuję za pomoc. – tlehman

+0

Friggin słodka praca na diagramach! Więc na miejscu muszę się śmiać. +1 fo sho. – telefunkenvf14

+1

Cudownie! Dwukrotne kliknięcie obrazów i przesuwanie obiektów wokół nich może obejmować przypadki, które różnią się od przykładów @ Tobiego, np. przypadek, w którym podzbiór '{1,3}' jest elementem listy, który wymaga ułożenia punktów w trójkącie. – kglr

7

Aby uzupełnić fajne diagramy Mike'a, tutaj jest sposób sprawdzenia, czy dowolna skończona lista list jest topologią, czyli (1) jeśli zawiera pusty zestaw, (2) zestaw podstawowy, (3) zamknięty ze skończonej przecięcia, oraz (3) zamyka się pod UNION:

topologyQ[x_List] := 
    Intersection[x, #] === # & [ 
    Union[ 
     {Union @@ x}, 
     Intersection @@@ [email protected]#, 
     Union @@@ # 
    ] & @ Subsets @ x 
    ] 

użytkowych do sześciu przykładach

list1 = {{}, {1, 2, 3}}; 
list2 = {{}, {1}, {1, 2, 3}}; 
list3 = {{}, {1}, {2}, {1, 2}, {1, 2, 3}}; 
list4 = {{}, {2}, {1, 2}, {2, 3}, {1, 2, 3}}; 
list5 = {{}, {2}, {3}, {1, 2, 3}}; 
list6 = {{}, {1, 2}, {2, 3}, {1, 2, 3}}; 

jak

topologyQ /@ {list1, list2, list3, list4, list5, list6} 

daje

{True, True, True, True, False, False} 

EDIT 1: W celu dalszego udoskonalenia preparatu, należy pamiętać, że operator

topoCover := (Union @@ {Union @@@ #, Intersection @@@ [email protected]#} &)@[email protected]# & 

daje zbiór uzyskany poprzez podejmowanie wszelkich sum i części wspólnych elementów kolekcji zestawów . Kolekcja zestawów list jest topologią, jeśli jest to stały punkt operatora topoCover.Tak można określić alternatywną funkcję, aby sprawdzić czy list jest topologia:

topologyQ2 := ([email protected]# === #) & 

Jeśli list nie jest topologia, topoCover daje Najmniejszy nadzbiór list który jest topologia. Więc

Complement[[email protected]#,#]& 

daje elementy mają zostać dodane do list aby topologii.

Można również rozważyć największy podzbiór (y) list, który jest topologią i element (y) do usunięcia z list w celu ich topologizacji. Odbywa się to za pomocą

maxTopoSubset := (If[{} == #, None, [email protected]#] &)@(GatherBy[ 
        Select[[email protected]#, topologyQ], Length[#] &]) & 

Stosowanej, na przykład, do list6 jak

[email protected] 

mamy dwie topologie

{{}, {1, 2}, {1, 2, 3}}, {{}, {2, 3}, {1, 2, 3}}} 

Aby uzyskać elementy, które należy usunąć, aby uzyskać topologię od list, można użyć

removeToTopologize := Table[Complement[#, Part[[email protected]#, i]], {i, 
          [email protected]@#}] & 

Korzystanie z list6 jak

[email protected] 

otrzymujemy

{{{2, 3}}, {{1, 2}}} 

czyli usunięcie {2,3} lub {1,2} z list6 daje topologii.

+0

+1 za tak zwięzłe! Tutaj byłem z siebie dumny, robiąc to w 9 liniach. Będę musiał przeczytać na temat funkcji "Odpoczynek" i operatora '@@', nie widziałem tego wcześniej. – tlehman

+0

"Odpoczynek" po prostu opuszcza pierwszy element i zajmuje resztę listy. '@@' jest skrótem od 'Apply'. W tym użyciu 'And @@ Flatten' zastępuje nagłówek' List' nagłówkiem 'And'. Również 'topologiaQ/@ {lista1, lista2, lista3, lista4, lista5, lista6}' jest wystarczająca. @kguler to "Union @ Apply [Union, ...]" naprawdę konieczne w ostatniej linii? Nie należy "Stosować [Unii, ...]" wykonać zadanie? –

+0

@Tobi, dziękuję. Faktycznie, zajęło sporo iteracji prób/błędów, aby to działało. Musiał użyć 'Rest', aby pozbyć się pustego zestawu na początku listy' Subsets [] '. Oczywiście wciąż jest dużo miejsca, aby było krótsze i bardziej eleganckie. – kglr