Scaling a part of a composite image
- To: mathgroup at smc.vnet.net
- Subject: [mg98748] Scaling a part of a composite image
- From: Alexei Boulbitch <Alexei.Boulbitch at iee.lu>
- Date: Fri, 17 Apr 2009 04:31:13 -0400 (EDT)
Dear community, In an image composed of at least two (or more) parts combined using Show, I would like to programmatically scale one of these two images with respect to the size of the whole composite image. Do you know, how to do this in Mathematica 6? Is it possible in Mathematica 6 to determine programmatically the total size of the Image? To be more concrete: the function below draws a 3D trajectory - a solution of a system of three ODE. In addition it draws a triangle attached to the trajectory. The latter plays the role of an arrow head showing the direction of the trajectory. Parameters in the argument are: point is a list of initial values {x0,y0,z0} of the trajectory, tmax is the calculation time, col is the color of both the trajectory and the arrow head, arrpos is the time fixing the position of the arrow on the trajectory, and arrsize scales the arrow size. The subfunction arr defines the arrow using 2 closely-lying points taken on the trajectory. directedTrajectory3D[point_List, tmax_, col_, arrpos_, arrsize_] := Module[{p0, eq4, eq5, eq6, pt1, pt2, s}, arr[pt1_List, pt2_List] := Module[{r}, r = (pt1 - pt2)2 /. List -> Plus // Sqrt; Graphics3D[ {col, Polygon[{pt1, {pt2[[1]], pt2[[2]] - 0.2*r, pt2[[3]] - 0.2*r}, {pt2[[1]], pt2[[2]] + 0.3*r, pt2[[3]] + 0.2*r} }]}]]; eq4 = x[0] == point[[1]]; eq5 = y[0] == point[[2]]; eq6 = z[0] == point[[3]]; s = NDSolve[{eq1, eq2, eq3, eq4, eq5, eq6}, {x, y, z}, {t, 0, tmax}]; p0 = ParametricPlot3D[ Evaluate[{x[t], y[t], z[t]} /. s], {t, 0, 30}, PlotRange -> All, PlotStyle -> col, AxesLabel -> {"x", "y", "z"}]; Show[{p0, arr[Evaluate[{x[arrpos], y[arrpos], z[arrpos]} /. s] // Flatten, Evaluate[{x[arrpos - 0.5*arrsize], y[arrpos - 0.5*arrsize], z[arrpos - 0.5*arrsize]}] /. s // Flatten]}] ]; One can try with the example of Lorentz system from help: Clear[eq1, eq2, eq3]; eq1 = \!\(\*SuperscriptBox["x", "\[Prime]", MultilineFunction->None]\)[t] == -3 (x[t] - y[t]); eq2 = \!\(\*SuperscriptBox["y", "\[Prime]", MultilineFunction->None]\)[t] == -x[t] z[t] + 26.5 x[t] - y[t]; eq3 = \!\(\*SuperscriptBox["z", "\[Prime]", MultilineFunction->None]\)[t] == x[t] y[t] - z[t]; directedTrajectory3D[{1, 0, 1}, 30, Red, 5, 0.1] A strong drawback is that in this function one needs to rescale the arrow sizes by hand each time. Compare two images with the same trajectory in which the arrow is placed the first time at t=5 and then at t=15 with the same arrsize=0.1. directedTrajectory3D[{1, 0, 1}, 30, Red, 5, 0.1] directedTrajectory3D[{1, 0, 1}, 30, Red, 15, 0.1] I would like to find a programmatic way of scaling the arrows so that they would be always visible and the same size. Thank you, Alexei -- Alexei Boulbitch, Dr., habil. Senior Scientist IEE S.A. ZAE Weiergewan 11, rue Edmond Reuter L-5326 Contern Luxembourg Phone: +352 2454 2566 Fax: +352 2454 3566 Website: www.iee.lu This e-mail may contain trade secrets or privileged, undisclosed or otherwise confidential information. If you are not the intended recipient and have received this e-mail in error, you are hereby notified that any review, copying or distribution of it is strictly prohibited. Please inform us immediately and destroy the original transmittal from your system. Thank you for your co-operation.