函数的表示跟人的自然的逻辑思维之间还是有差距
2017-06-29 14:50
232 查看
ArcTan是个奇葩函数,Reduce, Simplify不处理。
RegionPlot3D[Sqrt[x^2+y^2+z^2]<=2 &&((0<ArcTan[z,Sqrt[x^2+y^2]]<\[Pi]&&(0<ArcTan[x,y]<\[Pi]||0<ArcTan[-x,-y]<\[Pi]/2)) ||(0<ArcTan[-z,Sqrt[x^2+y^2]]<\[Pi]/2&&0<ArcTan[x,-y]<\[Pi]/2)) ||(Sqrt[x^2+y^2+z^2]<=1), {x,-2,2},{y,-2,2},{z,-2,2},PlotPoints->200,Mesh->None,Boxed->False,Axes->False,PlotTheme->"Classic"]
RegionPlot3D[1<=Sqrt[x^2+y^2+z^2]<=2 &&((0<ArcTan[z,Sqrt[x^2+y^2]]<\[Pi]&&(0<ArcTan[x,y]<\[Pi] ||0<ArcTan[-x,-y]<\[Pi]/2)) ||(0<ArcTan[-z,Sqrt[x^2+y^2]]<\[Pi]/2&&0<ArcTan[x,-y]<\[Pi]/2)), {x,-2,2},{y,-2,2},{z,-2,2},PlotPoints->160,Mesh->None,Boxed->False,Axes->False,PlotTheme->"Classic"]
Mathematica中绘制3D模型的函数,典型的,比较符合人们思维方式的是 RegionPlot3D。 3D模型可以转stl之类格式的起码有两类,一类是solid model, 一类surface model。
估计 RegionPlot3D 是为了 solid model 而生的。这使得它在绘图的时候虽然方便理解,但是存在诸多缺陷。尤其是棱角的地方,如果PlotPoints选项用默认、或者设定太小,就明显会出现视觉上的缺陷、直至根本不能用;如果设定太大,一般的电脑内存和CPU的情况下,累死也画不出来。
这里上面的例子简单,RegionPlot3D 都能搞定。最近发现,碰上稍微繁琐复杂的情况时,还是要考虑用Surface model,或者ContourPlot3D。这就涉及进一步的,如何把对体solid model的描述转化成对面surface model的描述。
这里有一个独立于built-in-function的很好的例子,让人看了非常开心。改用Surface model之后,大大提高了效率,改进了模型出图的视觉效果,简直是网友们智慧结晶的精品自定义函数。函数名字
contourRegionPlot3D,还是挺有意义的:
contourRegionPlot3D[region_,{x_,x0_,x1_},{y_,y0_,y1_},{z_,z0_,z1_},opts:OptionsPattern[]] :=Module[{reg,preds}, reg=LogicalExpand[region&&x0<=x<=x1&&y0<=y<=y1&&z0<=z<=z1]; preds=Union@Cases[reg,_Greater|_GreaterEqual|_Less|_LessEqual,-1]; Show@Table[ContourPlot3D[Evaluate[Equal@@p],{x,x0,x1},{y,y0,y1},{z,z0,z1}, RegionFunction->Function@@{{x,y,z},Refine[reg,p]&&Refine[!reg,!p]},opts], {p,preds}]]
放个例子:
contourRegionPlot3D[(x < 0 || y > 0 || z < 0) && 0.5 <= x^2 + y^2 + z^2 <= 0.99, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, Mesh -> None, BoundaryStyle -> None, PlotPoints -> 80, Boxed -> False, Axes -> False, PlotTheme -> "Classic"]
以及
contourRegionPlot3D[-2x+2y-2z+Sqrt[2]>=0 &&-2x-2y-2z+Sqrt[2]>=0 &&2x-2y-2z+Sqrt[2]>=0 &&2x+2y-2z+Sqrt[2]>=0 &&2x+2y+2z+Sqrt[2]>=0 &&-2x+2y+2z+Sqrt[2]>=0 &&2x-2y+2z+Sqrt[2]>=0 &&-2x-2y+2z+Sqrt[2]>=0 &&(-(1/Sqrt[2])-x)^2+y^2+z^2>1/4 &&x^2+(1/Sqrt[2]-y)^2+z^2>1/4 &&x^2+y^2+(-(1/Sqrt[2])-z)^2>1/4 &&x^2+y^2+(1/Sqrt[2]-z)^2>1/4 &&x^2+(-(1/Sqrt[2])-y)^2+z^2>1/4 &&(1/Sqrt[2]-x)^2+y^2+z^2>1/4, {x,-1,1},{y,-1,1},{z,-1,1}, PlotPoints->80,Mesh->None,PlotTheme->"Classic",BoundaryStyle->None,Axes->False,Boxed->False]
相关文章推荐
- 设计程序,单击【随机数】按钮,使用Math对象的random函数产生一个0-100之间(含0-100)的随机整数,并在对话框中显示,如下图。单击【计算】按钮,计算该随机数的平方、平方根和自然对数,保留两位小数,并在对话框中显示,如下图。
- 实现一个用分子分母的格式来表示有理数的结构体rational以及相关的函数,rational结构体之间可以做加减乘除运算,运算的结果仍然是rational
- Delphi与C++之间通过实现函数与对象共享
- 在Delphi与C++之间实现函数与对象共享
- 国书与洋书怎么差距还是这么大呢?
- 几个10进制和16进制之间转化的函数
- VC各类之间的调用函数总结
- iframe与父窗体之间的函数调用
- VBA与Transact-SQL 之间的函数比较
- VBA与T-SQL之间的函数比较;SQL Server的SQL语句如何在ACCESS中使用?(转自http://access911.net)
- 用malloc()函数更好还是用calloc()函数更好
- 混沌 In C++::是类型?还是函数调用?
- 涉及到数字中文表示的一些工具函数
- 今天下午写两个函数,还是比较通用的~~~
- msn space用户群小调查——看中日之间的差距
- vbscript和javascript之间的函数的调用
- 混沌 In C++::是类型?还是函数调用?
- 还是继续支持标准开发,再送一个页面加入FLASH的通用函数
- 归留学生:中美两国之间真正的可怕差距!
- 导师作业:2、编写一个函数,将一个整数值转换为16进制表示的字符串。