CImg how to draw Polygon from given x,y co-ordinates? - cimg

I am trying to draw a closed polygon from 5 points , I am trying with the following code :
CImg<float> img(800,800,1,3);
float red[] = {1.0f,0.0f,0.0f};
CImg<int> points(5,2);
int thePoints[] = {40,40,40,200,100,180,120,100,100,40};
int *iterator = thePoints;
cimg_forXY(points,x,y)
points(x,y) = *iterator++;
img.draw_polygon(points,red).display();
I have tried to give the points in ccw order , However I am not getting the polygon as expected .
What i get is like :
What can i do to generate a polygon as i expected ? How to give the points as input ? ccw or cw order or arbitrary order ?

You actually incorrectly define the variable points. It should be filled like this:
cimg_forX(points,i) { points(i,0) = *(iterator++); points(i,1) = *(iterator++); }
The points can be specified in either clockwise or counterclockwise order.

Related

How to get coords between 2 points

I cannot find exactly what I'm looking for or reading google documentation I missed it, I just need a function or whatever to submit 2 point, start and end, and get X waypoint in between.
Is there some api like "www.somesite.com/api.php?start=43.12,12.23&end=44.12,12.23&number_of_waypoints=5" that return some json?
thank you!
First of all, this will require working with geodesics, which are the shortest lines passing through two points around the Earth, assuming the Earth is an ellipsoid. WGS84 is the standard coordinate system you will see most widely used for "latitude + longitude" coordinates, and this assumes the Earth is an ellipsoid.
To solve this problem, you first need to find the azimuth (bearing angle from north) and distance between two coordinates. The way to calculate this is by solving the inverse geodesic problem.
Once we have this distance (let's say in metres), we can divide it by n, where n - 1 is the number of waypoints we want in between the line. This gives us the distance d metres between each waypoint.
Now, we need to plot points at intervals of d metres along this line. To do this, we can solve the direct geodesic problem. This gives us a new set of coordinates after moving a given distance from a given point with a given azimuth. We can do this repeatedly to get new points moving d metres from the previous point each time. One thing to note with this is that the resultant azimuth to the end of the line from different points within the line will vary, so the destination azimuth must be obtained after each stage and used for calculating the next point.
Solving the direct and inverse geodesic problems requires mathematical formulas, of which multiple are available. However, for your PHP application, you are probably best not trying to implement these yourself, but instead use a library which can do this for you. One popular library for PHP which does this is called phpgeo.
Here's an example of how this might be implemented with phpgeo:
<?php
use Location\Coordinate;
use Location\Distance\Vincenty;
use Location\Bearing\BearingEllipsoidal;
$numPoints = 5;
$coordsA = new Coordinate(50.0, 0.0);
$coordsB = new Coordinate(51.0, 1.0);
$bearingCalculator = new BearingEllipsoidal();
$distanceCalculator = new Vincenty();
// Inverse geodesic problem
// Calculate total length of line between coords
$totalDistance = $distanceCalculator->getDistance($coordsA, $coordsB);
$intervalDistance = $totalDistance / ($numPoints + 1);
// Inverse geodesic problem
// Calculate angle to destination
$currentBearing = $bearingCalculator->calculateBearing($coordsA, $coordsB);
$currentCoords = $coordsA;
$points = [];
for ($i = 0; $i < $numPoints; $i++) {
// Direct geodesic problem
// Calculate new point along line
$currentCoords =
$bearingCalculator->calculateDestination($currentCoords,
$currentBearing,
$intervalDistance);
// Add these new coordinates to the list
array_push($points, $currentCoords);
// Inverse geodesic problem
// Recalculate angle to destination
$currentBearing =
$bearingCalculator->calculateBearing($currentCoords,
$coordsB);
}
// Print out the list of points
foreach ($points as $point) {
echo "{$point->getLat()}, {$point->getLng()}\n";
}

Randomly drawing from a hypercube in Matlab

Consider the n-cube (defined here) with n>3. Suppose that it centered at the origin of the Cartesian plane and each edge has length 10.
I would like to write a piece of code in Matlab that allows me to randomly draw one point (with n coordinates) from this hypercube. Is there a way to do it without pre-defining a n-dimensional grid? In my particular application n=11.
To draw 1 point from the volume of an n-dimensional hypercube with side s, with all points having equal probability, you call
s = 10;
point = (rand(1,n)-0.5)*s;
Replace the 1 with a larger number if you want to draw many points at once.
Extending Jonas' answer, if you want to specify a center, do this:
center = [1.0 -1.0 2.0 -2.0 ...];
s = 10;
point = (rand(1,n)-0.5)*s + center;

How to create a quadrant-circle shape-matrix in Matlab?

Currently I have a problem with creating a matrix with a quadrant-shape. The problem is as follow:
I would like to have a 138 x 140 matrix with values of 2 and 3. Inside and on the quadrant circle, the values should be 2. Everything outside the circle, I need to have a value of 3. The radius of the circle is 138 (=R138). Hopefully the image below will support my explanation.
I was thinking of using 'triu' (and then flip) in matlab: then I will not get a circle, but a triangle instead (have not tried it yet). And that is not what I want.
What is the simplest way to create this matrix?
You could try this:
a = ones(138, 140)*3;
[gx, gy] = meshgrid(139:-1:0, 137:-1:0);
a(gx.*gx + gy.*gy <= 138*138) = 2;

How to get intersection area coordinates of two polygons on General Polygon Clipper(GPC)?

I'm using nutiteq library to draw polygons and getting the coordinates of the polygons with .getVertexList() command. Then I cast these coordinates to an array list . Then I cast these coordinates to another polygon list. GPC is calculating the intersection, union, XOR and difference areas integer values. Then I need to highlight the process area so I need processed areas coordinates but I can't get these coordinates directly from GPC.
The code I'm using for the area calculation is below. What should I do to get the coordinates of result polygon?. (I can't cast the coordinates directly by the way as you can see here...)
Thanks in advance.
public void IntersectionButton(View view) {
VectorElement selectedElement = mapView.getSelectedElement();
List<?> VisibleElements = selectedElement.getLayer().getVisibleElements();
ArrayList<Poly> polyList = new ArrayList<Poly>();
for (Object obj : VisibleElements) {
if (obj instanceof Polygon) {
Polygon poly = (Polygon) obj;
List<MapPos> geoList = poly.getVertexList();
Poly p = new PolyDefault();
for (MapPos pos : geoList) {
p.add(pos.x, pos.y);
}
polyList.add(p);
}
}
PolyDefault result = (PolyDefault) Clip.intersection(polyList.get(0), polyList.get(1));
int area = (int) (((int) result.getArea()) * (0.57417));
The result polygon seems to have all the methods you need:
getNumPoints() to get number of outer polygon points.
getX(i) to get X of specific outer polygon point, and getY(i) for Y.
getNumInnerPoly() to get number of holes in the polygon
getInnerPoly(i) to get specific hole. You iterate through hole similar way like outer polygon
You can construct new Nutiteq Polygon from this data, create list of MapPos for outer and list of list of MapPos for inner polygons (holes). What are values of X and Y, do they need further processing, is another question what you can investigate.

Traverse a circular path

I have an image that consists of concentric circles. How do I traverse each circle separately (knowing the Center coordinates and radius) in MATLAB?
if I think I understand the question correctly you are looking for a circle around a given point on an image. I have posted some code below, that will retrieve these points for you.
im = zeros([50,50]);
center = [20,20];
radius = 5;
x = 1:size(im,1);
y = 1:size(im,2);
[xx,yy] = meshgrid(x-center(1),y-center(2));
dist = sqrt(xx.^2+yy.^2)
circle = dist > radius-1 & dist < radius+1;
im would just be whatever the image is your are looking at