Skip to main content

graphics - Antialiasing in 3D


Is it possible? Is it platform specific? Does it rely on the graphics hardware? Why does the antialiasing slider under Preferences > Appearance > Graphics do nothing? I remember seeing some post-plotting solutions years before in MathGroup, but could not find it.


Edit


System is: HP EliteBook 8440p, integrated Intel HD Graphics, running Windows 7, 64bit



Answer



This needs specific support from your graphics card. My own graphics card is very old, and does not support it, so the slider does nothing on my machine.





But the good news is that there are workarounds, and I even made an antialiasing palette (code at the end of the post -- evaluate it, pop out the palette, and if you prefer, save it using Palettes -> Install Palette...).


This is the core antialiasing function I use:


antialias[g_, n_: 3] := 
ImageResize[Rasterize[g, "Image", ImageResolution -> n 72], Scaled[1/n]]

It simply renders a large image, and it downscales it. The results can be better than with a better graphics card's built-in antialiasing, so it's worth a look even if you have a good graphics card.


Problems with this method:




  • Fonts can be blurrier than what you'd like





  • With a high scaling factor, it may expose bugs in your graphics driver, and show some unusual results (I had problems with opacity in more complex graphics)




  • Tick marks don't scale properly (I think this is a bug), so they are barely visible on the antialiased version.






This is the palette code. Usage: select a 3D graphic and press the button. It'll insert an antialiased image below.



Begin["AA`"];

PaletteNotebook[DynamicModule[
{n = 3},
Column[{
SetterBar[
Dynamic[n], {2 -> "2\[Times]", 3 -> "3\[Times]",
4 -> "4\[Times]", 6 -> "6\[Times]"}, Appearance -> "Palette"],
Tooltip[
Button["Antialias", antialiasSelection[SelectedNotebook[], n],

Appearance -> "Palette"],
"Antialias selected graphics using the chosen scaling factor.\nA single 2D or 3D graphics box must be selected."]
}],
Initialization :> (
antialias[g_, n_Integer: 3] :=
ImageResize[Rasterize[g, "Image", ImageResolution -> n 72],
Scaled[1/n]];

antialiasSelection[doc_, n_] := Module[{selection, result},
selection = NotebookRead[doc];

If[MatchQ[selection, _GraphicsBox | _Graphics3DBox],
result =
ToBoxes@Image[antialias[ToExpression[selection], n],
Magnification -> 1];
SelectionMove[doc, After, Cell];
NotebookWrite[doc, result],

Beep[]
]
]

)
],
TooltipBoxOptions -> {TooltipDelay -> Automatic},
WindowTitle -> "Antialiasing"
]

End[];



Demonstration:



Mathematica graphics Mathematica graphics


Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....