PHP计算向量单位法向量及夹角时echo无输出问题如何解决
PHP向量单位法向量计算代码修复方案
核心错误点
- 函数返回值未接收:PHP函数内部变量为局部作用域,无法在外部直接访问,你调用所有计算函数后均未将返回值赋值给全局变量,导致echo的变量全部为未定义状态,无输出。
- 多返回值逻辑错误:函数执行到第一个
return语句就会终止运行,原cross_product、norm函数中的多个return语句全部无效,仅能返回第一个值,无法拿到叉乘的j、k分量和向量B的模。 - 入参未定义:调用
anglebetween、normalunitvector时传入的参数均为未定义的全局变量,函数无法拿到正确输入值进行计算。
修复后代码
<html> <head> <title> Comprehensive FORM CGI program </title> </head> <body bgcolor=#DDDDDD> <p> <!-- The lines above are the standard html header --> <?php // First get the input variables and their values $A = $_POST['f_A']; $B = $_POST['f_B']; $Acomponent = explode(",", $A); $Bcomponent = explode(",", $B); $AX = (int)$Acomponent[0]; $AY = (int)$Acomponent[1]; $AZ = (int)$Acomponent[2]; $BX = (int)$Bcomponent[0]; $BY = (int)$Bcomponent[1]; $BZ = (int)$Bcomponent[2]; function dot_product($AX, $AY, $AZ, $BX, $BY, $BZ){ $dotproduct = ($AX*$BX+$AY*$BY+$AZ*$BZ); return $dotproduct; } // 叉乘改为返回包含三个分量的数组 function cross_product($AX, $AY, $AZ, $BX, $BY, $BZ){ $i = ($AY*$BZ-$AZ*$BY); $j = (-1)*($AX*$BZ-$AZ*$BX); $k = ($AX*$BY-$AY*$BX); return [$i, $j, $k]; } // 模计算改为返回两个向量模的数组 function norm($AX, $AY, $AZ, $BX, $BY, $BZ) { $Anorm=sqrt(pow($AX,2)+pow($AY,2)+ pow($AZ,2)); $Bnorm=sqrt(pow($BX,2)+pow($BY,2)+ pow($BZ,2)); return [$Anorm, $Bnorm]; } function anglebetween($dotproduct,$Anorm, $Bnorm) { // 增加除零判断避免报错 if($Anorm * $Bnorm == 0) return 0; $angle = acos($dotproduct/($Anorm*$Bnorm)); return $angle; } function normalunitvector($i,$j,$k) { $crossnorm=sqrt(pow($i,2)+pow($j,2)+ pow($k,2)); // 增加叉乘模为0的判断(两向量共线无单位法向量) if($crossnorm == 0) return [0,0,0]; $normaluniti = $i/$crossnorm; $normalunitj = $j/$crossnorm; $normalunitk = $k/$crossnorm; return [$normaluniti, $normalunitj, $normalunitk]; } // 接收所有函数返回值 $dotproduct = dot_product($AX, $AY, $AZ, $BX, $BY, $BZ); list($i, $j, $k) = cross_product($AX, $AY, $AZ, $BX, $BY, $BZ); list($Anorm, $Bnorm) = norm($AX, $AY, $AZ, $BX, $BY, $BZ); $angle = anglebetween($dotproduct,$Anorm, $Bnorm); list($normaluniti, $normalunitj, $normalunitk) = normalunitvector($i,$j,$k); // 输出结果 echo "夹角弧度值:".$angle."<br>"; echo "单位法向量i分量:".$normaluniti."<br>"; echo "单位法向量j分量:".$normalunitj."<br>"; echo "单位法向量k分量:".$normalunitk."<br>"; ?> <p> <hr> <p> </body> </html>
内容的提问来源于stack exchange,提问作者Donghyok Lee
相关产品推荐
相关产品推荐

