안녕하세요 여러분,
X, Y, Z축에 30개의 이산점이 평면 1을 정의하고, X, Y, Z축에 30개의 다른 점이 평면 2를 정의합니다. 평면 1과 평면 2 사이의 각도를 계산해야 합니다. ChatGPT에서 다음 JSL 스크립트를 제공하지만 33번째 행에서 멈춰 있습니다. 이 스크립트를 실행하기 위해 두 개의 첨부 파일(*.jmp와 *.jsl)을 확인해 주시겠어요? 정말 감사합니다.
// Use current data table
dt = Current Data Table();
// Subset for Plane1 and Plane2
dt1 = dt << Subset( Where( :Plane == "Plane1" ), Output Table Name( "Plane1" ) );
dt2 = dt << Subset( Where( :Plane == "Plane2" ), Output Table Name( "Plane2" ) );
// Fit plane 1: z = a1*x + b1*y + c1
b1 = dt1 << Fit Model(
Y( :Z ),
Effects( :X, :Y ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run( "Fit Model" )
);
coeff1 = b1 << Get Estimates;
a1 = coeff1["X"];
b1_ = coeff1["Y"];
// Fit plane 2: z = a2*x + b2*y + c2
b2 = dt2 << Fit Model(
Y( :Z ),
Effects( :X, :Y ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run( "Fit Model" )
);
coeff2 = b2 << Get Estimates;
a2 = coeff2["X"];
b2_ = coeff2["Y"];
// Normal vectors: [a, b, -1]
n1 = [a1, b1_, -1];
n2 = [a2, b2_, -1];
// Compute dot product and magnitudes
dotProd = Sum( n1 * n2 );
mag1 = Sqrt( Sum( n1 ^ 2 ) );
mag2 = Sqrt( Sum( n2 ^ 2 ) );
// Compute angle in degrees
cosTheta = dotProd / (mag1 * mag2);
thetaRad = ACos( cosTheta );
thetaDeg = thetaRad * (180 / Pi());
// Display result
New Window( "Angle Between Planes",
Text Box( "Angle (degrees): " || Char( thetaDeg ) )
);
나머지 스크립트는 모르겠지만, 33번째 줄은 JSL로 작성되지 않았습니다.
n1 = [a1, b1_, -1];
n2 = [a2, b2_, -1];
아마도 더 비슷해야 할 것 같아요
n1 = a1 || b1_ || -1;
or perhaps
n2 = a2 |/ b2_ |/ -1;
n1 예제는 행 벡터를 만들어야 하고 n2는 열 벡터를 만들어야 합니다.
그리고 점곱도 아마 틀릴 겁니다. JMP의 요소별 곱셈이 필요한 것인지 찾아보고 알아봐야 합니다. *는 행렬 곱셈인데 필요한 연산자가 아닐 수도 있습니다.