I have a basic question but i cant seem to find an answer for it.
How do i draw a rectangle in mathematica with either clockwise or counterclockwise arrow heads.
In this picture i know two points i.e. (xmin,ymin) and (xmax,ymax). I want to stepwise quench my system and show it in this picture and hence many rectangles between min and max.
Rectangle command doesnt seem to provide an answer. And i want to do it with very many points, hence couple of answers that are available in forum are not so useful.
(-1+X+1/(1/3+(-3.+3 X)/(3 (1.*10^-18+4.5*10^-12 (2+X)+2.59808*10^-9 Sqrt[4.*10^-12-4 (-1+X)^3+1.*10^-6 (8-(-20+X) X)])^(1/3))+333333. (1.*10^-18+4.5*10^-12 (2+X)+2.59808*10^-9 Sqrt[4.*10^-12-4 (-1+X)^3+1.*10^-6 (8-(-20+X) X)])^(1/3)))/X
This is the plotted function f.
Now i want to select two X
values say X=1.1
and X=3
and divide interval into N parts X = {X1, X2, X3, X4, X5}
and directed rectangle between each of the two consecutive values.
Because i cant do it in mathematica i drew it in paint and it looks something like this with clockwise arrows for each rectangle.
Thanks, Nitin
Answer
Because using Graph
is fun:
f[x_] := Sqrt@x
x = {1.1, 1.6, 2.2, 2.4, 3}; (* put any thing you want here *)
coord = {First@#, {First@#[[2]], Last@#[[1]]}, Last@#, {First@#[[1]], Last@#[[2]]}} & /@
Partition[{#, f@#} & /@ x, 2, 1];
ef1[el_, ___] := {Arrowheads@0.03, Arrow[el]}
g = Graph[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1},
VertexCoordinates -> #,
EdgeShapeFunction -> ef1] & /@ coord;
Show[Plot[f[x], {x, 0, 5}, Frame -> True], g]
Then you can play with EdgeStyle
or VertexStyle
in g
to have fancy colors (or see Graph
's Options
for more details) and with Arrowheads
to have bigger/smaller heads.
Additions regarding coord
(as requested in the comments):
If you consider that {{x1,y1},{x2,y2},{x3,y3}}
are the coordinates of the three first points crossing f@x
you need to group them in order to create two rectangles:
rectgroups = Partition[{{x1,y1},{x2,y2},{x3,y3}}, 2, 1]
{{{x1, y1}, {x2, y2}}, {{x2, y2}, {x3, y3}}}
with {{x1, y1}, {x2, y2}}
and {{x2, y2}, {x3, y3}}
forming two rectangles by their opposed coordinates.
The problem here is that in order to draw a rectangle while using VertexCoordinates
(it's in fact not the case with Rectangle
) you need the four points defining your rectangle. Thus:
makerect = {First@#, {First@#[[2]], Last@#[[1]]}, Last@#, {First@#[[1]], Last@#[[2]]}}&;
makerect /@ rectgroups
{{{x1, y1}, {x2, y1}, {x2, y2}, {x1, y2}}, {{x2, y2}, {x3, y2}, {x3, y3}, {x2, y3}}}
gives you the two other coordinates needed to define the rectangles ({x2,y1}
and {x1,y2}
in the first case).
Comments
Post a Comment