|
本帖最后由 abababa 于 2024-3-22 20:07 编辑
我还是在学Asymptote的时候,网友给提供了一个求二次曲线的极点极线的命令,然后照着那个命令,我写了一个Mathematica的:
- MyPolar[f_, point_] := Module[{},
- AA := Coefficient[f, x, 2];
- BB := Coefficient[f, x*y, 1];
- CC := Coefficient[f, y, 2];
- g := f - (AA*x^2 + BB*x*y + CC*y^2);
- DD := Coefficient[g, x, 1];
- EE := Coefficient[g, y, 1];
- FF := g - (DD*x + EE*y);
- xx := point[[1]];
- yy := point[[2]];
- Return[FullSimplify[(2*AA*xx + BB*yy + DD)*x + (BB*xx + 2*CC*yy + EE)*y + (DD*xx*xx + EE*yy*yy + 2*FF)]];
- ]
复制代码
我写的上面的这个代码,要求第一个参数必须是x,y的表达式,并且必须是二次曲线的那种,如果不是二次曲线的就不行了,用u,v的表达式也不行,我想把它弄成像求导的像D[y^2,y,2]这样的,就是可以自己指定对什么东西求导,这样的话,再定义一个参数叫args_的,然后用的时候像MyPolar[u^2+v^2-1,{u,v},{0,1}]这样的,就能解决表达式的问题了,但这个我不会。
网友提供的那两个命令如下:
- /**
- * 取得点 p 关于圆锥曲线 c 的极线
- * @point p 点 p
- * @conic c 圆锥曲线 c
- * @return 返回点 p 关于圆锥曲线 c 的极线
- */
- line polar(point p, conic c) {
- bqe obqe = equation(c);
- real A = obqe.a[0], B = obqe.a[1], C = obqe.a[2], D = obqe.a[3], E = obqe.a[4], F = obqe.a[5];
- real x = p.x, y = p.y;
- return line((2*A*x+B*y+D), (B*x+2*C*y+E), (D*x+E*y+2*F));
- }
- /**
- * 取得直线 l 关于圆锥曲线 c 的极点
- * @line l 直线 l
- * @conic c 圆锥曲线 c
- * @return 返回直线 l 关于圆锥曲线 c 的极点
- */
- point pole(line l, conic c) {
- bqe obqe = equation(c);
- real A = obqe.a[0], B = obqe.a[1], C = obqe.a[2], D = obqe.a[3], E = obqe.a[4], F = obqe.a[5];
- real a = l.a, b = l.b, c =l.c;
- real m = a*(B*E-2*C*D)+b*(B*D-2*A*E)+c*(4*A*C-B*B);
- point p = ((a*(4*C*F-E*E)+b*(D*E-2*B*F)+c*(B*E-2*C*D))/m, (a*(D*E-2*B*F)+b*(4*A*F-D*D)+c*(B*D-2*A*E))/m);
- return p;
- }
复制代码 |
|