-2

I want to move a star marker along hexagon trajectory similar to "Circle trajectory" that I have added at the end of my question. Thanks.

This is the source code to that I have written yet for creating concentric hegzagons but I don't know how to move a star marker which traverses the concentric hexagons, I had written a similar simulation code for circle trajectory but I couldn't do it for hexagon.

%clc;    % Clear the command window.
%close all;  % Close all figures (except those of imtool.)
%clear;  % Erase all existing variables. Or clearvars if you want.
workspace;  % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 20;
angles = linspace(0, 360, 7);
radii = [20, 35, 50,70];
% First create and draw the hexagons.
numberOfHexagons = 4;
% Define x and y arrays.  Each row is one hexagon.
% Columns are the vertices.

x1=radii(1) * cosd(angles)+50;
y1 = radii(1) * sind(angles)+50;
x2=radii(2) * cosd(angles)+50;
y2 = radii(2) * sind(angles)+50;
x3=radii(3) * cosd(angles)+50;
y3 = radii(3) * sind(angles)+50;
 x4=radii(4) * cosd(angles)+50;
y4 = radii(4) * sind(angles)+50;
    plot(x1 , y1, 'b');
    hold on
      plot(x2, y2, 'b');
      hold on
       plot(x3, y3, 'b');
      hold on
       plot(x4, y4, 'b');
      hold on
      % Connecting Line:
plot([70 100], [50 50],'color','b')
    axis([0 100 0 100])
    hold on

Circle trajectory:

% Initialization steps.
format long g;
format compact;
fontSize = 20;
r1 = 50;
r2 = 35;
r3=  20;
xc = 50;
yc = 50;
% Since arclength = radius * (angle in radians),
% (angle in radians) = arclength / radius = 5 / radius.
deltaAngle1 = 5 / r1;
deltaAngle2 = 5 / r2;
deltaAngle3 = 5 / r3;
theta1 = 0 : deltaAngle1 : (2 * pi);
theta2 = 0 : deltaAngle2 : (2 * pi);
theta3 = 0 : deltaAngle3 : (2 * pi);
x1 = r1*cos(theta1) + xc;
y1 = r1*sin(theta1) + yc;
x2 = r2*cos(theta2) + xc;
y2 = r2*sin(theta2) + yc;
x3 = r3*cos(theta3) + xc;
y3 = r3*sin(theta3) + yc;
plot(x1,y1,'color',[1 0.5 0])
hold on
plot(x2,y2,'color',[1 0.5 0])
hold on
plot(x3,y3,'color',[1 0.5 0])
hold on

% Connecting Line:
plot([70 100], [50 50],'color',[1 0.5 0])
% Set up figure properties:
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0, 1, 1]);
drawnow;
axis square;
for i = 1 : length(theta1)
    plot(x1(i),y1(i),'r*')
    pause(0.1)
end
for i = 1 : length(theta2)
    plot(x2(i),y2(i),'r*')
    pause(0.1)
end
for i = 1 : length(theta3)
    plot(x3(i),y3(i),'r*')    
    pause(0.1)
end
zein
  • 35
  • 4
  • 2
    What is your question? – excaza Jul 07 '17 at 15:01
  • 1
    [Why is “Can someone help me?” not an actual question?](http://meta.stackoverflow.com/q/284236) Besides, dumping your code of part A and asking us to write part B without you showing any effort or research on part B is not very well appreciated here. – Adriaan Jul 07 '17 at 15:02
  • Thanks for your comment, but I really tried to do it by myself but unfortunately I couldn't and I had no choice but to ask my question here,moreover I didn't put the part A to ask you to write part B , if you read my question carefully you would know that I had written part B to draw circle trajectory in which a red star marker traverses concentric circles and now i want to write code that creates the similar situation for hexagon trajectory but I have problem with writing its code and I have wrote code that only creates concentric hexagons. – zein Jul 07 '17 at 15:35
  • You are mentioning hexagon and concentric hexagons so what trajectory you exactly need? I assume from your last question that it should be hexagon spiral with equidistant points. Is it so? I would use hexagonal rotation kernel for this. Here example of square rotation kernel [Rotate a diagonal line in a 2D 3 x 3 grid - rotation matrix needed?](https://stackoverflow.com/a/40355825/2521214) see the `rot45cw()` function in **edit1** – Spektre Jul 08 '17 at 06:39

1 Answers1

0

I would generalize your problem with parametric function for the trajectory. In it use rotation kernel which you want here few examples in C++/VCL/GDI (sorry I am not Matlab friendly but the equations should be the same in Matlab too) for circle,square and hexagon rotation kernels:

void getpnt_circle(double &x,double &y,double &pi2,double r,double t)   // (x,y) = circle(r,t) t=<0,1>
    {
    pi2=2.0*M_PI;   // circumference(r=1) 6.283185307179586476925286766559
    t*=pi2;
    x=r*cos(t);
    y=r*sin(t);
    }
//---------------------------------------------------------------------------
void getpnt_square(double &x,double &y,double &pi2,double r,double t)   // (x,y) = square(r,t) t=<0,1>
    {
    pi2=8.0;        // circumference(r=1)
    // kernel
    const int n=4;                              // sides
    const double x0[n]={+1.0,+1.0,-1.0,-1.0};   // side start point
    const double y0[n]={-1.0,+1.0,+1.0,-1.0};
    const double dx[n]={ 0.0,-2.0, 0.0,+2.0};   // side tangent
    const double dy[n]={+2.0, 0.0,-2.0, 0.0};

    int ix;
    t-=floor(t);    // t = <0, 1.0)
    t*=n;           // t = <0,n)
    ix=floor(t);    // side of square
    t-=ix;          // distance from side start

    x=r*(x0[ix]+t*dx[ix]);
    y=r*(y0[ix]+t*dy[ix]);
    }
//---------------------------------------------------------------------------
void getpnt_hexagon(double &x,double &y,double &pi2,double r,double t)  // (x,y) = square(r,t) t=<0,1>
    {
    pi2=6.0;        // circumference(r=1)
    // kernel
    const int n=6;                                      // sides
    const double c60=cos(60.0*M_PI/180.0);
    const double s60=sin(60.0*M_PI/180.0);
    const double x0[n]={+1.0,+c60,-c60,-1.0,-c60,+c60}; // side start point
    const double y0[n]={ 0.0,+s60,+s60, 0.0,-s60,-s60};
    const double dx[n]={-c60,-1.0,-c60,+c60,+1.0,+c60}; // side tangent
    const double dy[n]={+s60, 0.0,-s60,-s60, 0.0,+s60};

    int ix;
    t-=floor(t);    // t = <0, 1.0)
    t*=n;           // t = <0,n)
    ix=floor(t);    // side of square
    t-=ix;          // distance from side start

    x=r*(x0[ix]+t*dx[ix]);
    y=r*(y0[ix]+t*dy[ix]);
    }
//---------------------------------------------------------------------------
void TMain::draw()
    {
    if (!_redraw) return;

    // clear buffer
    bmp->Canvas->Brush->Color=clBlack;
    bmp->Canvas->FillRect(TRect(0,0,xs,ys));

    int e;
    double r,t,x,y,c,dr=15.0,dl=15.0;
    int xx,yy,rr=3;
    bmp->Canvas->MoveTo(xs2,ys2);
    bmp->Canvas->Pen->Color=clAqua;
    bmp->Canvas->Brush->Color=clBlue;
    for (r=dr,t=0.0;;)
        {
        // get point from selected kernel
//      getpnt_circle (x,y,c,r,t);
//      getpnt_square (x,y,c,r,t);
        getpnt_hexagon(x,y,c,r,t);
        // render it
        xx=xs2+x;
        yy=ys2+y;
        bmp->Canvas->LineTo(xx,yy);
        bmp->Canvas->Ellipse(xx-rr,yy-rr,xx+rr,yy+rr);
        // update position
        r+=dr*dr/(r*c);
        t+=dl/(r*c); t-=floor(t);
        if (r>=xs2) break;
        if (r>=ys2) break;
        }

    // render backbuffer
    Main->Canvas->Draw(0,0,bmp);
    _redraw=false;
    }
//---------------------------------------------------------------------------

You can ignore the VCL/GDI rendering stuff.
xs,ys is full and xs2,ys2 is half resolution of window to scale the plot properly...
dl is distance between markers [pixels]
dr is distance between spiral screws [pixels]

the spiral is sampled with r,t step depending on the actual circumference (that is what the pi2 or c is for). The getpnt_xxxxx function will return x,y coordinate of your shape from parameter t=<0,1> and actual radius r. It also returns the actual value of circumference/r ratio called pi2

Here preview of the 3 kernels used for spiral ...

spirals

Spektre
  • 41,942
  • 8
  • 91
  • 312