나는 고전적인 방식으로 1부터 6까지의 숫자를 나타내는 1부터 6까지의 숫자가 매겨진 면을 가지고 노는 주사위인 Asymptote를 3D로 사용하여 첫 번째 그림을 코딩했습니다. 이 주사위는 마우스로 조작할 수 있습니다.
문제는 주사위를 조작할 때 점을 나타내는 원반이 반짝인다는 점이다.
Draw 문(25행)에 주석을 달면 draw(scale3(84a)*unitcube, surfacepen=white);
디스크가 전혀 깜박이지 않지만 갑자기 주사위가 투명해집니다. 문제는 디스크의 파란색이 흰색 면에 겹쳐 인쇄된다는 사실에서 비롯된 것이라고 결론을 내렸습니다. 따라서 해결책은 Tikz에서 수행할 수 있는 것처럼 두 단계로 얼굴을 색칠하는 것입니다.
- 공백에 디스크가 없는 얼굴
- 파란색의 단일 디스크
단 clip
, fill
, , unfill
, filldraw
명령은 3D surface()
기능에서는 작동하지 않습니다.
깜박임 없이 주사위 면에 색을 어떻게 칠할 수 있나요?
점근선 파일은 .asy
다음과 같습니다(코드는 읽을 수 있도록 최적화되지 않았습니다).
import three;
currentprojection =orthographic((5,2,3));
currentlight=nolight;
settings.tex="latex"; // Moteur LaTeX utilisé pour la compilation (latex, pdflatex, ...)
settings.outformat="pdf"; // Format de sortie ; eps par défaut
settings.prc=true; // Format PRC de la figure ; vrai par défaut
settings.render=-1; // Rendu des figures ; -1 par défaut
size(6cm,0);
real a = 0.05;
path carre = box ((0,0),(84a,84a)),
disque = scale(9a)*unitcircle,
patron1[] = shift(42a,42a)*disque,
patron2[] = shift(14a,70a)*disque^^shift(70a,14a)*disque,
patron3[] = shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(42a,42a)*disque,
patron4[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque,
patron5[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,42a)*disque,
patron6[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,70a)*disque^^shift(42a,14a)*disque;
transform3 tX=shift(84a*X), tY=shift(84a*Y), tZ=shift(84a*Z);
path3 facegauche[] =path3(patron6,ZXplane),
facedroite[] =path3(patron1,ZXplane),
faceavant[] =path3(patron2,YZplane),
facearriere[] =path3(patron5,YZplane),
facehaut[] =path3(patron4,XYplane),
facebas[] =path3(patron3,XYplane);
draw(scale3(84a)*unitcube, surfacepen=white);
draw(box(O, 84a*(X+Y+Z)), gray);
draw(surface(facegauche),blue);
draw(surface(tY*facedroite),blue);
draw(surface(tZ*facehaut),blue);
draw(surface(facebas),blue);
draw(surface(facearriere),blue);
draw(surface(tX*faceavant),blue);
답변1
프랑스어 포럼에서 프랑스어 답변을 받은 후 대략적인 영어 답변을 찾아보세요. 실제로 디스크는 큐브의 면 위/안에 있지만 면에 대한 디스크의 상대적인 위치를 아는 것은 불가능합니다. 수치 근사에 따라 디스크는 면 위/아래에 있고 숫자 인공물은 깜박임을 생성합니다.
해결 방법 1) : 여기에서 제안하는 각 디스크를 올바른 방향으로 이동합니다.
import three;
currentprojection =orthographic((5,2,3));
currentlight=nolight;
settings.tex="latex"; // Moteur LaTeX utilisé pour la compilation (latex, pdflatex, ...)
settings.outformat="pdf"; // Format de sortie ; eps par défaut
settings.prc=true; // Format PRC de la figure ; vrai par défaut
settings.render=-1; // Rendu des figures ; -1 par défaut
size(6cm,0);
real a = 0.05;
path carre = box ((0,0),(84a,84a)),
disque = scale(9a)*unitcircle,
patron1[] = shift(42a,42a)*disque,
patron2[] = shift(14a,70a)*disque^^shift(70a,14a)*disque,
patron3[] = shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(42a,42a)*disque,
patron4[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque,
patron5[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,42a)*disque,
patron6[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,70a)*disque^^shift(42a,14a)*disque;
transform3 tX=shift((84a+00.1)*X), tY=shift((84a+.001)*Y), tZ=shift((84a+0.01)*Z);
path3 facegauche[] =shift(0,-0.001,0)*path3(patron6,ZXplane),
facedroite[] =path3(patron1,ZXplane),
faceavant[] =path3(patron2,YZplane),
facearriere[] =shift(-0.001,0,0)*path3(patron5,YZplane),
facehaut[] =path3(patron4,XYplane),
facebas[] =shift(0,0,-0.001)*path3(patron3,XYplane);
draw(scale3(84a)*unitcube, surfacepen=white);
draw(box(O, 84a*(X+Y+Z)), gray);
draw(surface(facegauche),blue);
draw(surface(tY*facedroite),blue);
draw(surface(tZ*facehaut),blue);
draw(surface(facebas),blue);
draw(surface(facearriere),blue);
draw(surface(tX*faceavant),blue);
해결 방법 2): 주사위 면의 실제 표면을 만듭니다. 업데이트: 두 번째 해결책을 찾으세요. 실제로 bezulate
2D 경로를 3D로 변환할 수 있습니다. 문서에 따르면,
평면 베지어 표면 패치는 Orest Shardt의 bezulate 루틴을 사용하여 구성됩니다. 이 루틴은 단순 순환 경로(끝점에서만 교차)로 경계가 지정된(단순히 연결되지 않을 수도 있음) 영역을 길이 4 이상의 순환 경로로 경계가 지정된 하위 영역으로 분해합니다. 더 적은.
구멍을 만들려면 다음을 사용해야 합니다 reverse
(경로를 따라 뒤로 실행). 예: bezulate(unitsquate^^reverse(scale(.3)*unitcircle))
. 그런 다음 surface(bezulate(unitsquate^^reverse(scale(.3)*unitcircle)))
작은 구멍이 있는 단위 정사각형의 표면을 만듭니다. 완전한 주사위의 코드입니다.
import three;
currentprojection =orthographic((5,2,3));
currentlight=nolight;
settings.tex="latex"; // Moteur LaTeX utilisé pour la compilation (latex, pdflatex, ...)
//settings.outformat="pdf"; // Format de sortie ; eps par défaut
settings.prc=true; // Format PRC de la figure ; vrai par défaut
settings.render=-1; // Rendu des figures ; -1 par défaut
size(6cm,0);
real a = 0.05;
path carre = box ((0,0),(84a,84a)),
// reverse est capital pour créer les trous avec bezulate
// c'est la règle : unitsquare et disque ne seront pas dans le
// même sens, donc bezulate comprend que c'est un trou
disque = scale(9a)*reverse(unitcircle),
patron1[] = shift(42a,42a)*disque,
patron2[] = shift(14a,70a)*disque^^shift(70a,14a)*disque,
patron3[] = shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(42a,42a)*disque,
patron4[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque,
patron5[] = shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,42a)*disque,
patron6[]= shift(14a,14a)*disque^^shift(14a,70a)*disque^^shift(70a,14a)*disque^^shift(70a,70a)*disque^^shift(42a,70a)*disque^^shift(42a,14a)*disque;
transform3 tX=shift((84a)*X), tY=shift((84a)*Y), tZ=shift((84a)*Z);
path3 facegauche[] =path3(patron6,ZXplane),
facedroite[] =path3(patron1,ZXplane),
faceavant[] =path3(patron2,YZplane),
facearriere[] =path3(patron5,YZplane),
facehaut[] =path3(patron4,XYplane),
facebas[] =path3(patron3,XYplane);
// draw(scale3(84a)*unitcube, surfacepen=white);
draw(box(O, 84a*(X+Y+Z)), gray);
draw(surface(facegauche),blue);
draw(surface(tY*facedroite),blue);
draw(surface(tZ*facehaut),blue);
draw(surface(facebas),blue);
draw(surface(facearriere),blue);
draw(surface(tX*faceavant),blue);
// les faces trouées
path[] gp6=bezulate(scale(84a)*unitsquare^^patron6);
path[] gp5=bezulate(scale(84a)*unitsquare^^patron5);
path[] gp4=bezulate(scale(84a)*unitsquare^^patron4);
path[] gp3=bezulate(scale(84a)*unitsquare^^patron3);
path[] gp2=bezulate(scale(84a)*unitsquare^^patron2);
path[] gp1=bezulate(scale(84a)*unitsquare^^patron1);
surface s1=shift((0,84a,84a))*rotate(90,Y)*rotate(90,X)*surface(gp1);
surface s2=shift(84a,0,0)*rotate(-90,Y)*surface(gp2);
surface s3=surface(gp3);
surface s4=shift((0,0,84a))*surface(gp4);
surface s5=shift((0,0,84a))*rotate(90,Y)*surface(gp5);
surface s6=shift((0,0,84a))*rotate(90,Y)*rotate(90,X)*surface(gp6);
draw(s6,red);
draw(s5,red);
draw(s4,red);
draw(s3,red);
draw(s2,red);
draw(s1,red);
그리고 그 결과
OG