다음 Metapost 코드를 살펴보십시오.
path p;
p = (0,0){up}..{right}(200,100)..{up}(300,400)..cycle;
len := arclength p;
s := arctime (2500) of p;
t := arctime (len+2500) of p;
draw p;
show len;% 2799
show s;% 2.92...
show t;% 2.67...
s와 t는 왜 같지 않나요? 내가 원호 길이를 추가하면 아무것도 바뀌지 않을 것이라고 생각합니다. 실수는 어디에 있습니까?
편집: 여기에서 버전 2.02를 사용했습니다. http://www.tlhiv.org/mppreview/
This is MetaPost, version 2.02 (TeX Live 2023) (kpathsea version 6.3.5) 28 APR 2024 02:47
**preview.mp
(/usr/share/texlive/texmf-dist/metapost/base/mpost.mp
(/usr/share/texlive/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./preview.mp
>> 2799.0210591829564
>> 2.9211035593209118
>> 2.6795082428530486 [0] )
1 output file written: preview.mps
답변1
arctime
나는 무엇을 하는지와 그것을 계산하는 데 사용되는 알고리즘을 완전히 이해한다고 주장하지 않습니다 . 파일에서 MetaPost 소스 코드를 확인합니다 mp.w
(cweave를 사용하여 이 CWEB 파일을 PDF로 컴파일할 수 있지만 일부 _
s에는 접두사가 붙지 않아 \_
TeXed할 때 오류가 발생함), 섹션 405, "arclength 및 arctime 작업은 모두 재귀적 방식을 기반으로 합니다. dz0, dz1, dz2..."가 주어진 3차 스플라인의 호 길이를 찾는 함수이며 실제 구현은 mp_get_arc_time
섹션 419의 함수입니다.
이 섹션을 읽으면서 제가 이해한 것은 arctime
의 역함수를 구현하기 위해 부동 소수점(또는 고정 소수점) 숫자에 대한 이진 검색을 사용하여 제로 찾기로 구현된다는 것 입니다 mp_do_arc_test()
.
기본 32비트 고정 소수점(스케일링이라고도 함)을 사용하여 명령줄에서 MetaPost를 사용하는 경우 epsilon = 0.00002
.
그만큼http://www.tlhiv.org/mppreview/set 을 사용하는 double을 사용 epsilon = 1.52587890625e-05
하고 다른 숫자 시스템은 모두 비슷한 값을 사용합니다.
419조에는 이렇게 나와 있습니다.
arc0이 순환 경로 h의 호 길이보다 길면 결과는 경로 길이보다 큰 시간 값이 됩니다.
arc0
에 제공된 숫자 인수는 어디에 있습니까 arctime
?
질문의 수정된 예를 사용하여,
path p;
p = (0,0){up}..{right}(200,100)..{up}(300,400)..cycle;
len := arclength p;
s := arctime (2500) of p;
t := arctime (len+2500) of p;
show len;
show s;
show t;
show epsilon;
show arclength subpath (0,t) of p;
show len+2500;
end;
기본 배율 숫자 시스템 사용:
>> 2799.02077
>> 2.92111
>> 5.92111
>> 0.00002
>> 5299.043
>> 5299.02077
사용하여-numbersystem=double
>> 2799.0210591829564
>> 2.9211035593209118
>> 2.6795082428530486
>> 1.52587890625e-05
>> 2200.7155501530865
>> 5299.0210591829564
제가 보기에는 이 설명에 맞는 올바른 값인 것 같습니다 t=5.92
. 결과는 을 사용하여 해석할 수 있습니다 t = s + l
. 여기서 는 l
순환 경로의 길이이며 p
길이는 3입니다. 또한 의 동작에 대한 MetaPost 매뉴얼 설명과도 일치합니다. arctime
그것은 말한다arclength subpath (0,t) of p = a
t=2.67...
따라서 결과는 추가된 다른 숫자 시스템으로 인한 버그를 나타낼 가능성이 매우 높습니다 .
답변2
추가 업데이트: 개발팀이 저장소에 수정 사항을 게시했습니다. 거기에서 가져와서 로컬로 만들었더니 좋아 보입니다. 아래에 붙여넣은 예제를 사용하면 이제 다음과 같은 결과를 얻습니다.
> mpost b.mp
This is MetaPost, version 2.11 (TeX Live 2025/dev) (kpathsea version 6.4.0/dev)
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.02077
>> 2.92111
>> 5.92111
>> 3
>> "scaled" [1] )
1 output file written: b.1
Transcript written on b.log.
> mpost -numbersystem=double b.mp
This is MetaPost, version 2.11 (TeX Live 2025/dev) (kpathsea version 6.4.0/dev)
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.0210591829564
>> 2.9211035593209118
>> 5.9211035593209118
>> 3
>> "double" [1] )
1 output file written: b.1
Transcript written on b.log.
다른 숫자 체계와 유사합니다. 이 수정 사항은 틀림없이 적절한 시기에 표준 배포판에 반영될 것입니다.
원래 질문에 답하기
MP의 연산자 는 경로가 PostScript 포인트에서 원하는 길이에 도달할 때 경로의 arctime
시간을 반환합니다 .t
arclength
따라서 p
가 경로이고 가 a
원하는 길이라면 다음 과 같은 arctime a of p
시간을 제공합니다 . 모든 일반적인 사용에서 원하는 길이 가 0과 사이인지 확인해야 합니다 .t
arclength subpath(0, t) of p = a
a
arclength p
그러나 경로가 p
순환하는 경우 길이를 더 길게 지정할 수 있습니다. 이는 참조할 수 있는 방식과 유사하다 point 9 of fullcircle
. 소스 코드를 살펴보면 MP가 순환 경로의 실제 길이보다 더 길게 원하는 길이를 구체적으로 제공한다는 것을 알 수 있다. 알고리즘은 지점별로 경로를 따라 작동하며 주기의 시작 부분으로 돌아가면 나머지 프로세스를 단축하기 위한 계산을 수행합니다(정말 세부 정보를 원하는 경우 소스 코드를 검사할 수 있습니다).
이 계산을 구현하면 새로운 숫자 시스템에 버그가 발생했으며 현재는 수정되었습니다. 빠른 수정을 위해 개발팀에 감사드립니다.
업데이트: 개발팀확인하다MP 소스 코드에서 암시적 정수 수학을 사용했기 때문에 이는 버그처럼 보입니다.
정말 댓글인데 로그파일 부분이 너무 길어서 이렇게 답변드립니다.
현재 버전의 MP에서는 귀하의 예가 이전 scaled
숫자 시스템에서 예상된 결과를 제공하는 것으로 나타났습니다. 그러나 세 가지 새로운 시스템 중 하나에서 "예상치 못한" 결과가 발생했습니다. 개발팀에 보고할 내용인 것 같습니다.
OP 예제에 다음과 같이 몇 줄을 추가하면:
beginfig(1);
path p;
p = (0,0){up}..{right}(200,100)..{up}(300,400)..cycle;
len := arclength p;
s := arctime (2500) of p;
t := arctime (len+2500) of p;
draw p;
show len;% 2799
show s;% 2.92...
show t;% 2.67...
show arctime arclength p of p;
show numbersystem;
endfig;
end
mpost
그런 다음 기본 숫자 시스템을 사용 하여 실행하면 다음 로그 파일을 얻습니다 .
This is MetaPost, version 2.10 (TeX Live 2024) (kpathsea version 6.4.0) 28 APR 2024 15:56
**b.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.02077
>> 2.92111
>> 5.92111
>> 3
>> "scaled" [1] )
1 output file written: b.1
그러나 다른 세 가지 숫자 체계 중 하나를 사용하면 t
처음 보고된 "예상치 못한" 값을 얻게 됩니다. 따라서 arclength
새로운 숫자 시스템을 사용하여 순환 경로를 계산하는 데 문제가 있는 것 같습니다 .
:!mpost -numbersystem=double b.mp
This is MetaPost, version 2.10 (TeX Live 2024) (kpathsea version 6.4.0)
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.0210591829564
>> 2.9211035593209118
>> 2.6795082428530486
>> 3
>> "double" [1] )
1 output file written: b.1
Transcript written on b.log.
"b.log" 12L, 389B
:!mpost -numbersystem=decimal b.mp
This is MetaPost, version 2.10 (TeX Live 2024) (kpathsea version 6.4.0) 28 APR 2024 15:58
**b.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.021059182955437254465959453077
>> 2.921103559320912153438877894997069
>> 2.67950824285304864431956913069307
>> 3
>> "decimal" [1] )
1 output file written: b.1
:!mpost -numbersystem=binary b.mp
This is MetaPost, version 2.10 (TeX Live 2024) (kpathsea version 6.4.0) 28 APR 2024 15:58
**b.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2024/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./b.mp
>> 2799.0210591829554372544659594531163
>> 2.9211035593209121534388778949970568
>> 2.6795082428530486443195691306930351
>> 3
>> "binary" [1] )
1 output file written: b.1
MP에 대한 내 경험에 따르면 이전 scaled
시스템이 거의 항상 더 좋습니다. OP는 별도로 요청하지 않는 한 thiv.org의 미리 보기 소유자에게 기본 번호 시스템을 사용하도록 요청할 수 있습니다.