Ordering 2D Border PointsImplementing a POCO editor split over a number of TabItemsSprite animation handlerBest way of updating a list of unique items“Critter Tracking: When does it cross its own path?”Simple dictionary storing/viewing applicationProject Euler #11 Largest product in a gridRotate an array to the right by a given number of stepsAlgorithm that finds two numbers that sum to a targetFiltering and Validating value in SETTER

What's the difference between a variable and a memory location?

Why do IR remotes influence AM radios?

Did ancient peoples ever hide their treasure behind puzzles?

Is this position a forced win for Black after move 14?

Was it illegal to blaspheme God in Antioch in 360.-410.?

Don't look at what I did there

What is the practical impact of using System.Random which is not cryptographically random?

Journal published a paper, ignoring my objections as a referee

What caused the end of cybernetic implants?

How to handle inventory and story of a player leaving

In Endgame, wouldn't Stark have remembered Hulk busting out of the stairwell?

“I hope he visit us more often” Why is this wrong?

What is the purpose of Strength, Intelligence and Dexterity in Path of Exile?

How can I reply to coworkers who accuse me of automating people out of work?

Which polygons can be turned inside out by a smooth deformation?

is "prohibition against," a double negative?

Do universities maintain secret textbooks?

Isometric Heyacrazy - Now In 3D!

Under GDPR, can I give permission once to allow everyone to store and process my data?

Count the number of triangles

How can I throw a body?

Spicing up a moment of peace

Is Pathfinder 2e compatible with Pathfinder 1e, and D&D 3.5 and 3rd edition?

Why did Starhopper's exhaust plume become brighter just before landing?



Ordering 2D Border Points


Implementing a POCO editor split over a number of TabItemsSprite animation handlerBest way of updating a list of unique items“Critter Tracking: When does it cross its own path?”Simple dictionary storing/viewing applicationProject Euler #11 Largest product in a gridRotate an array to the right by a given number of stepsAlgorithm that finds two numbers that sum to a targetFiltering and Validating value in SETTER






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3












$begingroup$


What i am trying to do



I have an image of a polygon exemple:
County



what i am tring to do is getting all border points, that do not have at least one neighbour with the same color, and ordering them in a way that later i can draw lines



The Code



private Vector2F[] ReorderBorder(Vector2F[] Data) 

List<Vector2F> BorderPixels = new List<Vector2F>();

BorderPixels.AddRange(Data);

List<int> Indexs = new List<int>();
Indexs.Add(0);

bool Working = true;

while (Working)


int LastIndex = Indexs.Last();

List<int> Possible = new List<int>();

for (int Index = 0; Index < BorderPixels.Count; Index++)


if (!Indexs.Contains(Index))


if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);



Indexs.Add(GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels));

if (BorderPixels.Count == Indexs.Count)
Working = false;


List<Vector2F> Vertices = new List<Vector2F>();

for (int Index = 0; Index < Indexs.Count; Index++)
Vertices.Add(BorderPixels[Indexs[Index]]);

return Vertices.ToArray();


private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)

if (Indices.Length == 1)
return Indices[0];

Vector2F[] IndicesTest = new Vector2F[Indices.Length];

///Relativity
/// 0 - Up
/// 1 - Up Right
/// 2 - Right
/// 3 - Down Right
/// 4 - Down
/// 5 - Down Left
/// 6 - Left
/// 7 - Up Left
for (int Index = 0; Index < Indices.Length; Index++)

if(new Vector2F(Origin.X, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 0);
else if(new Vector2F(Origin.X + 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 1);
else if (new Vector2F(Origin.X + 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 2);
else if (new Vector2F(Origin.X + 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 3);
else if (new Vector2F(Origin.X, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 4);
else if (new Vector2F(Origin.X - 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 5);
else if (new Vector2F(Origin.X - 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 6);
else if (new Vector2F(Origin.X - 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 7);


if (IndicesTest.Length != 0)

Array.Sort(IndicesTest, CompareY);
return (int)IndicesTest[0].X;


return 0;


private int CompareY(Vector2F Left, Vector2F Right)

if (Left.Y < Right.Y)
return -1;
else if (Left.Y == Right.Y)
return 0;
else
return 1;



What it does



private Vector2F[] ReorderBorder(Vector2F[] Data)


This is the main function where i pass the border points, currently orderd by y so 0,0 1,0 2,0 0,1 1,1 etc..



so what it does is starting from the first pixel it get all existing border pixels in 8 directions and add the "preferenced" pixel (see GetPreference function) then after finishing ordering all pixels it sends a orderd array back



private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)


this functions recives a point and a list of possible neighbours then it returns the index of the perfed one (lowest score see code)



private int CompareY(Vector2F Left, Vector2F Right)


this function is simply used to sort by the lowest y, for the score on the GetPreference function



What i want to know



All i want to know is if there is any way to optmized the code, or a better alternative, i know that the code as some bugs but this is the most reliable way i could do, since i was not able to find any good alternative online










share|improve this question











$endgroup$













  • $begingroup$
    All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
    $endgroup$
    – Olivier Jacot-Descombes
    8 hours ago











  • $begingroup$
    @OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
    $endgroup$
    – Bot Wade
    7 hours ago











  • $begingroup$
    Looking at HTML color codes and names I would say the color is very close to Tea Green.
    $endgroup$
    – Olivier Jacot-Descombes
    7 hours ago











  • $begingroup$
    @OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
    $endgroup$
    – Bot Wade
    7 hours ago






  • 2




    $begingroup$
    @BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
    $endgroup$
    – TomG
    7 hours ago

















3












$begingroup$


What i am trying to do



I have an image of a polygon exemple:
County



what i am tring to do is getting all border points, that do not have at least one neighbour with the same color, and ordering them in a way that later i can draw lines



The Code



private Vector2F[] ReorderBorder(Vector2F[] Data) 

List<Vector2F> BorderPixels = new List<Vector2F>();

BorderPixels.AddRange(Data);

List<int> Indexs = new List<int>();
Indexs.Add(0);

bool Working = true;

while (Working)


int LastIndex = Indexs.Last();

List<int> Possible = new List<int>();

for (int Index = 0; Index < BorderPixels.Count; Index++)


if (!Indexs.Contains(Index))


if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);



Indexs.Add(GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels));

if (BorderPixels.Count == Indexs.Count)
Working = false;


List<Vector2F> Vertices = new List<Vector2F>();

for (int Index = 0; Index < Indexs.Count; Index++)
Vertices.Add(BorderPixels[Indexs[Index]]);

return Vertices.ToArray();


private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)

if (Indices.Length == 1)
return Indices[0];

Vector2F[] IndicesTest = new Vector2F[Indices.Length];

///Relativity
/// 0 - Up
/// 1 - Up Right
/// 2 - Right
/// 3 - Down Right
/// 4 - Down
/// 5 - Down Left
/// 6 - Left
/// 7 - Up Left
for (int Index = 0; Index < Indices.Length; Index++)

if(new Vector2F(Origin.X, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 0);
else if(new Vector2F(Origin.X + 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 1);
else if (new Vector2F(Origin.X + 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 2);
else if (new Vector2F(Origin.X + 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 3);
else if (new Vector2F(Origin.X, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 4);
else if (new Vector2F(Origin.X - 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 5);
else if (new Vector2F(Origin.X - 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 6);
else if (new Vector2F(Origin.X - 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 7);


if (IndicesTest.Length != 0)

Array.Sort(IndicesTest, CompareY);
return (int)IndicesTest[0].X;


return 0;


private int CompareY(Vector2F Left, Vector2F Right)

if (Left.Y < Right.Y)
return -1;
else if (Left.Y == Right.Y)
return 0;
else
return 1;



What it does



private Vector2F[] ReorderBorder(Vector2F[] Data)


This is the main function where i pass the border points, currently orderd by y so 0,0 1,0 2,0 0,1 1,1 etc..



so what it does is starting from the first pixel it get all existing border pixels in 8 directions and add the "preferenced" pixel (see GetPreference function) then after finishing ordering all pixels it sends a orderd array back



private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)


this functions recives a point and a list of possible neighbours then it returns the index of the perfed one (lowest score see code)



private int CompareY(Vector2F Left, Vector2F Right)


this function is simply used to sort by the lowest y, for the score on the GetPreference function



What i want to know



All i want to know is if there is any way to optmized the code, or a better alternative, i know that the code as some bugs but this is the most reliable way i could do, since i was not able to find any good alternative online










share|improve this question











$endgroup$













  • $begingroup$
    All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
    $endgroup$
    – Olivier Jacot-Descombes
    8 hours ago











  • $begingroup$
    @OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
    $endgroup$
    – Bot Wade
    7 hours ago











  • $begingroup$
    Looking at HTML color codes and names I would say the color is very close to Tea Green.
    $endgroup$
    – Olivier Jacot-Descombes
    7 hours ago











  • $begingroup$
    @OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
    $endgroup$
    – Bot Wade
    7 hours ago






  • 2




    $begingroup$
    @BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
    $endgroup$
    – TomG
    7 hours ago













3












3








3


1



$begingroup$


What i am trying to do



I have an image of a polygon exemple:
County



what i am tring to do is getting all border points, that do not have at least one neighbour with the same color, and ordering them in a way that later i can draw lines



The Code



private Vector2F[] ReorderBorder(Vector2F[] Data) 

List<Vector2F> BorderPixels = new List<Vector2F>();

BorderPixels.AddRange(Data);

List<int> Indexs = new List<int>();
Indexs.Add(0);

bool Working = true;

while (Working)


int LastIndex = Indexs.Last();

List<int> Possible = new List<int>();

for (int Index = 0; Index < BorderPixels.Count; Index++)


if (!Indexs.Contains(Index))


if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);



Indexs.Add(GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels));

if (BorderPixels.Count == Indexs.Count)
Working = false;


List<Vector2F> Vertices = new List<Vector2F>();

for (int Index = 0; Index < Indexs.Count; Index++)
Vertices.Add(BorderPixels[Indexs[Index]]);

return Vertices.ToArray();


private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)

if (Indices.Length == 1)
return Indices[0];

Vector2F[] IndicesTest = new Vector2F[Indices.Length];

///Relativity
/// 0 - Up
/// 1 - Up Right
/// 2 - Right
/// 3 - Down Right
/// 4 - Down
/// 5 - Down Left
/// 6 - Left
/// 7 - Up Left
for (int Index = 0; Index < Indices.Length; Index++)

if(new Vector2F(Origin.X, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 0);
else if(new Vector2F(Origin.X + 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 1);
else if (new Vector2F(Origin.X + 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 2);
else if (new Vector2F(Origin.X + 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 3);
else if (new Vector2F(Origin.X, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 4);
else if (new Vector2F(Origin.X - 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 5);
else if (new Vector2F(Origin.X - 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 6);
else if (new Vector2F(Origin.X - 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 7);


if (IndicesTest.Length != 0)

Array.Sort(IndicesTest, CompareY);
return (int)IndicesTest[0].X;


return 0;


private int CompareY(Vector2F Left, Vector2F Right)

if (Left.Y < Right.Y)
return -1;
else if (Left.Y == Right.Y)
return 0;
else
return 1;



What it does



private Vector2F[] ReorderBorder(Vector2F[] Data)


This is the main function where i pass the border points, currently orderd by y so 0,0 1,0 2,0 0,1 1,1 etc..



so what it does is starting from the first pixel it get all existing border pixels in 8 directions and add the "preferenced" pixel (see GetPreference function) then after finishing ordering all pixels it sends a orderd array back



private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)


this functions recives a point and a list of possible neighbours then it returns the index of the perfed one (lowest score see code)



private int CompareY(Vector2F Left, Vector2F Right)


this function is simply used to sort by the lowest y, for the score on the GetPreference function



What i want to know



All i want to know is if there is any way to optmized the code, or a better alternative, i know that the code as some bugs but this is the most reliable way i could do, since i was not able to find any good alternative online










share|improve this question











$endgroup$




What i am trying to do



I have an image of a polygon exemple:
County



what i am tring to do is getting all border points, that do not have at least one neighbour with the same color, and ordering them in a way that later i can draw lines



The Code



private Vector2F[] ReorderBorder(Vector2F[] Data) 

List<Vector2F> BorderPixels = new List<Vector2F>();

BorderPixels.AddRange(Data);

List<int> Indexs = new List<int>();
Indexs.Add(0);

bool Working = true;

while (Working)


int LastIndex = Indexs.Last();

List<int> Possible = new List<int>();

for (int Index = 0; Index < BorderPixels.Count; Index++)


if (!Indexs.Contains(Index))


if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);
else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
Possible.Add(Index);



Indexs.Add(GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels));

if (BorderPixels.Count == Indexs.Count)
Working = false;


List<Vector2F> Vertices = new List<Vector2F>();

for (int Index = 0; Index < Indexs.Count; Index++)
Vertices.Add(BorderPixels[Indexs[Index]]);

return Vertices.ToArray();


private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)

if (Indices.Length == 1)
return Indices[0];

Vector2F[] IndicesTest = new Vector2F[Indices.Length];

///Relativity
/// 0 - Up
/// 1 - Up Right
/// 2 - Right
/// 3 - Down Right
/// 4 - Down
/// 5 - Down Left
/// 6 - Left
/// 7 - Up Left
for (int Index = 0; Index < Indices.Length; Index++)

if(new Vector2F(Origin.X, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 0);
else if(new Vector2F(Origin.X + 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 1);
else if (new Vector2F(Origin.X + 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 2);
else if (new Vector2F(Origin.X + 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 3);
else if (new Vector2F(Origin.X, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 4);
else if (new Vector2F(Origin.X - 1, Origin.Y + 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 5);
else if (new Vector2F(Origin.X - 1, Origin.Y) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 6);
else if (new Vector2F(Origin.X - 1, Origin.Y - 1) == BorderPixels[Indices[Index]])
IndicesTest[Index] = new Vector2F(Indices[Index], 7);


if (IndicesTest.Length != 0)

Array.Sort(IndicesTest, CompareY);
return (int)IndicesTest[0].X;


return 0;


private int CompareY(Vector2F Left, Vector2F Right)

if (Left.Y < Right.Y)
return -1;
else if (Left.Y == Right.Y)
return 0;
else
return 1;



What it does



private Vector2F[] ReorderBorder(Vector2F[] Data)


This is the main function where i pass the border points, currently orderd by y so 0,0 1,0 2,0 0,1 1,1 etc..



so what it does is starting from the first pixel it get all existing border pixels in 8 directions and add the "preferenced" pixel (see GetPreference function) then after finishing ordering all pixels it sends a orderd array back



private int GetPreference(Vector2F Origin, int[] Indices, List<Vector2F> BorderPixels)


this functions recives a point and a list of possible neighbours then it returns the index of the perfed one (lowest score see code)



private int CompareY(Vector2F Left, Vector2F Right)


this function is simply used to sort by the lowest y, for the score on the GetPreference function



What i want to know



All i want to know is if there is any way to optmized the code, or a better alternative, i know that the code as some bugs but this is the most reliable way i could do, since i was not able to find any good alternative online







c# coordinate-system






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 43 mins ago









dfhwze

10.3k2 gold badges19 silver badges67 bronze badges




10.3k2 gold badges19 silver badges67 bronze badges










asked 8 hours ago









Bot WadeBot Wade

601 silver badge10 bronze badges




601 silver badge10 bronze badges














  • $begingroup$
    All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
    $endgroup$
    – Olivier Jacot-Descombes
    8 hours ago











  • $begingroup$
    @OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
    $endgroup$
    – Bot Wade
    7 hours ago











  • $begingroup$
    Looking at HTML color codes and names I would say the color is very close to Tea Green.
    $endgroup$
    – Olivier Jacot-Descombes
    7 hours ago











  • $begingroup$
    @OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
    $endgroup$
    – Bot Wade
    7 hours ago






  • 2




    $begingroup$
    @BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
    $endgroup$
    – TomG
    7 hours ago
















  • $begingroup$
    All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
    $endgroup$
    – Olivier Jacot-Descombes
    8 hours ago











  • $begingroup$
    @OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
    $endgroup$
    – Bot Wade
    7 hours ago











  • $begingroup$
    Looking at HTML color codes and names I would say the color is very close to Tea Green.
    $endgroup$
    – Olivier Jacot-Descombes
    7 hours ago











  • $begingroup$
    @OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
    $endgroup$
    – Bot Wade
    7 hours ago






  • 2




    $begingroup$
    @BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
    $endgroup$
    – TomG
    7 hours ago















$begingroup$
All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
$endgroup$
– Olivier Jacot-Descombes
8 hours ago





$begingroup$
All green points seem to have at least one neighbour with the same color and all transparent points seem to have at least one neighbour being transparent. So, according to your definition there are no points in the result set. Your working example draws black lines that are not on a border. I'm a bit confused.
$endgroup$
– Olivier Jacot-Descombes
8 hours ago













$begingroup$
@OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
$endgroup$
– Bot Wade
7 hours ago





$begingroup$
@OlivierJacot-Descombes first i dont know what you mean with green points the exemple is yellow second getting the points from the image is not in question, i have everything working i just want to know if the reorganization of the points can be optimized, and final in the exemple we have yellow so the way i get points is if a points is yellow see if any of the neighbours is transparent if yes then add to the border list if does not then do not add and in the point in question is transperent completely ignore
$endgroup$
– Bot Wade
7 hours ago













$begingroup$
Looking at HTML color codes and names I would say the color is very close to Tea Green.
$endgroup$
– Olivier Jacot-Descombes
7 hours ago





$begingroup$
Looking at HTML color codes and names I would say the color is very close to Tea Green.
$endgroup$
– Olivier Jacot-Descombes
7 hours ago













$begingroup$
@OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
$endgroup$
– Bot Wade
7 hours ago




$begingroup$
@OlivierJacot-Descombes look that as nothing to do with the question so unless you have anything constructive to say please stop comenting
$endgroup$
– Bot Wade
7 hours ago




2




2




$begingroup$
@BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
$endgroup$
– TomG
7 hours ago




$begingroup$
@BotWade: don't be rude to people trying to help. The second picture, titled "working exemple", doesn't make much sense. The border lines are all over the place. I suggest you either update or remove the picture. Also, arguing over colors is unnecessary. Ever heard of colorblindness?
$endgroup$
– TomG
7 hours ago










3 Answers
3






active

oldest

votes


















2













$begingroup$

You are making the test !Indexs.Contains(Index). Since Indexs is a List<int> you have a look up time of O(n). A HashSet<T> has an approximate look up time of O(1). Create a hash set for this test. Since a set is not ordered, you still need the list.



var Indexs = new List<int>();
var indexTest = new HashSet<int>();

Indexs.Add(0);
indexTest.Add(0);


and



int i = GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels);
Indexs.Add(i);
indexTest.Add(i);


and of course now test with



if (!indexTest.Contains(Index))


  • Another point is the repeated indexed access of border pixels. Store the pixels in a temp. This also makes the code more readable.


  • You can merge all the if-statements into one conditional expression. Because of the Short-Circuit Evaluation In C#, the evaluation will stop at the first term evaluating to true.


  • You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined with y-1, y, y+1.


  • The Boolean temp Working can be inlined.


  • You can initialize collections in the constructor or with collection initializers.


  • The C# naming conventions use camelCase for parameter names and local variables.


  • Since neither data nor borderPixels are altered, copying data into borderPixels seems superfluous. I simply renamed data to borderPixels. This change requires the type of the last parameter of GetPreference to be changed from List<Vector2F> to Vector2F[] and borderPixels.Count must be changed to borderPixels.Length.


The new ReorderBorder method:



private Vector2F[] ReorderBorder(Vector2F[] borderPixels)

var indexes = new List<int> 0 ;
var indexTest = new HashSet<int> 0 ;

while (indexes.Count < borderPixels.Length)
int lastIndex = indexes.Last();
Vector2F last = borderPixels[lastIndex];

var possible = new List<int>();
for (int index = 0; index < borderPixels.Length; index++)
if (!indexTest.Contains(index))
Vector2F current = borderPixels[index];
if (new Vector2F(last.X - 1, last.Y - 1) == current


int preferredIndex = GetPreference(last, possible.ToArray(), borderPixels);
indexes.Add(preferredIndex);
indexTest.Add(preferredIndex);


var vertices = new List<Vector2F>();
for (int index = 0; index < indexes.Count; index++)
vertices.Add(borderPixels[indexes[index]]);


return vertices.ToArray();



You can also apply some of these changes to GetPreference.






share|improve this answer











$endgroup$






















    1













    $begingroup$

    Use enums When in the below snippet each index really means what the numbers stand for in the comments then you definitely need at least an enum for that. This is so extremely fragile. Without these comments nobody ever would be able to decipher this logic.




    ///Relativity
    /// 0 - Up
    /// 1 - Up Right
    /// 2 - Right
    /// 3 - Down Right
    /// 4 - Down
    /// 5 - Down Left
    /// 6 - Left
    /// 7 - Up Left
    for (int Index = 0; Index < Indices.Length; Index++)






    share|improve this answer









    $endgroup$






















      1













      $begingroup$

      DRY Principle



      As a small addendum on Olivier Jacot-Descombes' answer, I would like to add you should go for DRY code.



      answer snippet:




      "You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined
      with y-1, y, y+1."




      This..



      var current = BorderPixels[Index];
      var last = BorderPixels[LastIndex];
      if (Math.Abs(current.X - last.X) <= 1 && Math.Abs(current.Y - last.Y) <= 1)

      Possible.Add(Index);



      replaces..




      if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
      Possible.Add(Index);
      else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
      Possible.Add(Index);






      share|improve this answer











      $endgroup$

















        Your Answer






        StackExchange.ifUsing("editor", function ()
        StackExchange.using("externalEditor", function ()
        StackExchange.using("snippets", function ()
        StackExchange.snippets.init();
        );
        );
        , "code-snippets");

        StackExchange.ready(function()
        var channelOptions =
        tags: "".split(" "),
        id: "196"
        ;
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function()
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled)
        StackExchange.using("snippets", function()
        createEditor();
        );

        else
        createEditor();

        );

        function createEditor()
        StackExchange.prepareEditor(
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: false,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: null,
        bindNavPrevention: true,
        postfix: "",
        imageUploader:
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        ,
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        );



        );













        draft saved

        draft discarded


















        StackExchange.ready(
        function ()
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f227130%2fordering-2d-border-points%23new-answer', 'question_page');

        );

        Post as a guest















        Required, but never shown

























        3 Answers
        3






        active

        oldest

        votes








        3 Answers
        3






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        2













        $begingroup$

        You are making the test !Indexs.Contains(Index). Since Indexs is a List<int> you have a look up time of O(n). A HashSet<T> has an approximate look up time of O(1). Create a hash set for this test. Since a set is not ordered, you still need the list.



        var Indexs = new List<int>();
        var indexTest = new HashSet<int>();

        Indexs.Add(0);
        indexTest.Add(0);


        and



        int i = GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels);
        Indexs.Add(i);
        indexTest.Add(i);


        and of course now test with



        if (!indexTest.Contains(Index))


        • Another point is the repeated indexed access of border pixels. Store the pixels in a temp. This also makes the code more readable.


        • You can merge all the if-statements into one conditional expression. Because of the Short-Circuit Evaluation In C#, the evaluation will stop at the first term evaluating to true.


        • You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined with y-1, y, y+1.


        • The Boolean temp Working can be inlined.


        • You can initialize collections in the constructor or with collection initializers.


        • The C# naming conventions use camelCase for parameter names and local variables.


        • Since neither data nor borderPixels are altered, copying data into borderPixels seems superfluous. I simply renamed data to borderPixels. This change requires the type of the last parameter of GetPreference to be changed from List<Vector2F> to Vector2F[] and borderPixels.Count must be changed to borderPixels.Length.


        The new ReorderBorder method:



        private Vector2F[] ReorderBorder(Vector2F[] borderPixels)

        var indexes = new List<int> 0 ;
        var indexTest = new HashSet<int> 0 ;

        while (indexes.Count < borderPixels.Length)
        int lastIndex = indexes.Last();
        Vector2F last = borderPixels[lastIndex];

        var possible = new List<int>();
        for (int index = 0; index < borderPixels.Length; index++)
        if (!indexTest.Contains(index))
        Vector2F current = borderPixels[index];
        if (new Vector2F(last.X - 1, last.Y - 1) == current


        int preferredIndex = GetPreference(last, possible.ToArray(), borderPixels);
        indexes.Add(preferredIndex);
        indexTest.Add(preferredIndex);


        var vertices = new List<Vector2F>();
        for (int index = 0; index < indexes.Count; index++)
        vertices.Add(borderPixels[indexes[index]]);


        return vertices.ToArray();



        You can also apply some of these changes to GetPreference.






        share|improve this answer











        $endgroup$



















          2













          $begingroup$

          You are making the test !Indexs.Contains(Index). Since Indexs is a List<int> you have a look up time of O(n). A HashSet<T> has an approximate look up time of O(1). Create a hash set for this test. Since a set is not ordered, you still need the list.



          var Indexs = new List<int>();
          var indexTest = new HashSet<int>();

          Indexs.Add(0);
          indexTest.Add(0);


          and



          int i = GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels);
          Indexs.Add(i);
          indexTest.Add(i);


          and of course now test with



          if (!indexTest.Contains(Index))


          • Another point is the repeated indexed access of border pixels. Store the pixels in a temp. This also makes the code more readable.


          • You can merge all the if-statements into one conditional expression. Because of the Short-Circuit Evaluation In C#, the evaluation will stop at the first term evaluating to true.


          • You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined with y-1, y, y+1.


          • The Boolean temp Working can be inlined.


          • You can initialize collections in the constructor or with collection initializers.


          • The C# naming conventions use camelCase for parameter names and local variables.


          • Since neither data nor borderPixels are altered, copying data into borderPixels seems superfluous. I simply renamed data to borderPixels. This change requires the type of the last parameter of GetPreference to be changed from List<Vector2F> to Vector2F[] and borderPixels.Count must be changed to borderPixels.Length.


          The new ReorderBorder method:



          private Vector2F[] ReorderBorder(Vector2F[] borderPixels)

          var indexes = new List<int> 0 ;
          var indexTest = new HashSet<int> 0 ;

          while (indexes.Count < borderPixels.Length)
          int lastIndex = indexes.Last();
          Vector2F last = borderPixels[lastIndex];

          var possible = new List<int>();
          for (int index = 0; index < borderPixels.Length; index++)
          if (!indexTest.Contains(index))
          Vector2F current = borderPixels[index];
          if (new Vector2F(last.X - 1, last.Y - 1) == current


          int preferredIndex = GetPreference(last, possible.ToArray(), borderPixels);
          indexes.Add(preferredIndex);
          indexTest.Add(preferredIndex);


          var vertices = new List<Vector2F>();
          for (int index = 0; index < indexes.Count; index++)
          vertices.Add(borderPixels[indexes[index]]);


          return vertices.ToArray();



          You can also apply some of these changes to GetPreference.






          share|improve this answer











          $endgroup$

















            2














            2










            2







            $begingroup$

            You are making the test !Indexs.Contains(Index). Since Indexs is a List<int> you have a look up time of O(n). A HashSet<T> has an approximate look up time of O(1). Create a hash set for this test. Since a set is not ordered, you still need the list.



            var Indexs = new List<int>();
            var indexTest = new HashSet<int>();

            Indexs.Add(0);
            indexTest.Add(0);


            and



            int i = GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels);
            Indexs.Add(i);
            indexTest.Add(i);


            and of course now test with



            if (!indexTest.Contains(Index))


            • Another point is the repeated indexed access of border pixels. Store the pixels in a temp. This also makes the code more readable.


            • You can merge all the if-statements into one conditional expression. Because of the Short-Circuit Evaluation In C#, the evaluation will stop at the first term evaluating to true.


            • You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined with y-1, y, y+1.


            • The Boolean temp Working can be inlined.


            • You can initialize collections in the constructor or with collection initializers.


            • The C# naming conventions use camelCase for parameter names and local variables.


            • Since neither data nor borderPixels are altered, copying data into borderPixels seems superfluous. I simply renamed data to borderPixels. This change requires the type of the last parameter of GetPreference to be changed from List<Vector2F> to Vector2F[] and borderPixels.Count must be changed to borderPixels.Length.


            The new ReorderBorder method:



            private Vector2F[] ReorderBorder(Vector2F[] borderPixels)

            var indexes = new List<int> 0 ;
            var indexTest = new HashSet<int> 0 ;

            while (indexes.Count < borderPixels.Length)
            int lastIndex = indexes.Last();
            Vector2F last = borderPixels[lastIndex];

            var possible = new List<int>();
            for (int index = 0; index < borderPixels.Length; index++)
            if (!indexTest.Contains(index))
            Vector2F current = borderPixels[index];
            if (new Vector2F(last.X - 1, last.Y - 1) == current


            int preferredIndex = GetPreference(last, possible.ToArray(), borderPixels);
            indexes.Add(preferredIndex);
            indexTest.Add(preferredIndex);


            var vertices = new List<Vector2F>();
            for (int index = 0; index < indexes.Count; index++)
            vertices.Add(borderPixels[indexes[index]]);


            return vertices.ToArray();



            You can also apply some of these changes to GetPreference.






            share|improve this answer











            $endgroup$



            You are making the test !Indexs.Contains(Index). Since Indexs is a List<int> you have a look up time of O(n). A HashSet<T> has an approximate look up time of O(1). Create a hash set for this test. Since a set is not ordered, you still need the list.



            var Indexs = new List<int>();
            var indexTest = new HashSet<int>();

            Indexs.Add(0);
            indexTest.Add(0);


            and



            int i = GetPreference(BorderPixels[LastIndex], Possible.ToArray(), BorderPixels);
            Indexs.Add(i);
            indexTest.Add(i);


            and of course now test with



            if (!indexTest.Contains(Index))


            • Another point is the repeated indexed access of border pixels. Store the pixels in a temp. This also makes the code more readable.


            • You can merge all the if-statements into one conditional expression. Because of the Short-Circuit Evaluation In C#, the evaluation will stop at the first term evaluating to true.


            • You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined with y-1, y, y+1.


            • The Boolean temp Working can be inlined.


            • You can initialize collections in the constructor or with collection initializers.


            • The C# naming conventions use camelCase for parameter names and local variables.


            • Since neither data nor borderPixels are altered, copying data into borderPixels seems superfluous. I simply renamed data to borderPixels. This change requires the type of the last parameter of GetPreference to be changed from List<Vector2F> to Vector2F[] and borderPixels.Count must be changed to borderPixels.Length.


            The new ReorderBorder method:



            private Vector2F[] ReorderBorder(Vector2F[] borderPixels)

            var indexes = new List<int> 0 ;
            var indexTest = new HashSet<int> 0 ;

            while (indexes.Count < borderPixels.Length)
            int lastIndex = indexes.Last();
            Vector2F last = borderPixels[lastIndex];

            var possible = new List<int>();
            for (int index = 0; index < borderPixels.Length; index++)
            if (!indexTest.Contains(index))
            Vector2F current = borderPixels[index];
            if (new Vector2F(last.X - 1, last.Y - 1) == current


            int preferredIndex = GetPreference(last, possible.ToArray(), borderPixels);
            indexes.Add(preferredIndex);
            indexTest.Add(preferredIndex);


            var vertices = new List<Vector2F>();
            for (int index = 0; index < indexes.Count; index++)
            vertices.Add(borderPixels[indexes[index]]);


            return vertices.ToArray();



            You can also apply some of these changes to GetPreference.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 5 hours ago

























            answered 6 hours ago









            Olivier Jacot-DescombesOlivier Jacot-Descombes

            2,91012 silver badges19 bronze badges




            2,91012 silver badges19 bronze badges


























                1













                $begingroup$

                Use enums When in the below snippet each index really means what the numbers stand for in the comments then you definitely need at least an enum for that. This is so extremely fragile. Without these comments nobody ever would be able to decipher this logic.




                ///Relativity
                /// 0 - Up
                /// 1 - Up Right
                /// 2 - Right
                /// 3 - Down Right
                /// 4 - Down
                /// 5 - Down Left
                /// 6 - Left
                /// 7 - Up Left
                for (int Index = 0; Index < Indices.Length; Index++)






                share|improve this answer









                $endgroup$



















                  1













                  $begingroup$

                  Use enums When in the below snippet each index really means what the numbers stand for in the comments then you definitely need at least an enum for that. This is so extremely fragile. Without these comments nobody ever would be able to decipher this logic.




                  ///Relativity
                  /// 0 - Up
                  /// 1 - Up Right
                  /// 2 - Right
                  /// 3 - Down Right
                  /// 4 - Down
                  /// 5 - Down Left
                  /// 6 - Left
                  /// 7 - Up Left
                  for (int Index = 0; Index < Indices.Length; Index++)






                  share|improve this answer









                  $endgroup$

















                    1














                    1










                    1







                    $begingroup$

                    Use enums When in the below snippet each index really means what the numbers stand for in the comments then you definitely need at least an enum for that. This is so extremely fragile. Without these comments nobody ever would be able to decipher this logic.




                    ///Relativity
                    /// 0 - Up
                    /// 1 - Up Right
                    /// 2 - Right
                    /// 3 - Down Right
                    /// 4 - Down
                    /// 5 - Down Left
                    /// 6 - Left
                    /// 7 - Up Left
                    for (int Index = 0; Index < Indices.Length; Index++)






                    share|improve this answer









                    $endgroup$



                    Use enums When in the below snippet each index really means what the numbers stand for in the comments then you definitely need at least an enum for that. This is so extremely fragile. Without these comments nobody ever would be able to decipher this logic.




                    ///Relativity
                    /// 0 - Up
                    /// 1 - Up Right
                    /// 2 - Right
                    /// 3 - Down Right
                    /// 4 - Down
                    /// 5 - Down Left
                    /// 6 - Left
                    /// 7 - Up Left
                    for (int Index = 0; Index < Indices.Length; Index++)







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered 39 mins ago









                    t3chb0tt3chb0t

                    38.1k7 gold badges61 silver badges142 bronze badges




                    38.1k7 gold badges61 silver badges142 bronze badges
























                        1













                        $begingroup$

                        DRY Principle



                        As a small addendum on Olivier Jacot-Descombes' answer, I would like to add you should go for DRY code.



                        answer snippet:




                        "You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined
                        with y-1, y, y+1."




                        This..



                        var current = BorderPixels[Index];
                        var last = BorderPixels[LastIndex];
                        if (Math.Abs(current.X - last.X) <= 1 && Math.Abs(current.Y - last.Y) <= 1)

                        Possible.Add(Index);



                        replaces..




                        if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                        Possible.Add(Index);
                        else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                        Possible.Add(Index);






                        share|improve this answer











                        $endgroup$



















                          1













                          $begingroup$

                          DRY Principle



                          As a small addendum on Olivier Jacot-Descombes' answer, I would like to add you should go for DRY code.



                          answer snippet:




                          "You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined
                          with y-1, y, y+1."




                          This..



                          var current = BorderPixels[Index];
                          var last = BorderPixels[LastIndex];
                          if (Math.Abs(current.X - last.X) <= 1 && Math.Abs(current.Y - last.Y) <= 1)

                          Possible.Add(Index);



                          replaces..




                          if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                          Possible.Add(Index);
                          else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                          Possible.Add(Index);






                          share|improve this answer











                          $endgroup$

















                            1














                            1










                            1







                            $begingroup$

                            DRY Principle



                            As a small addendum on Olivier Jacot-Descombes' answer, I would like to add you should go for DRY code.



                            answer snippet:




                            "You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined
                            with y-1, y, y+1."




                            This..



                            var current = BorderPixels[Index];
                            var last = BorderPixels[LastIndex];
                            if (Math.Abs(current.X - last.X) <= 1 && Math.Abs(current.Y - last.Y) <= 1)

                            Possible.Add(Index);



                            replaces..




                            if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);






                            share|improve this answer











                            $endgroup$



                            DRY Principle



                            As a small addendum on Olivier Jacot-Descombes' answer, I would like to add you should go for DRY code.



                            answer snippet:




                            "You have duplicated some cases. You have 12 instead of 8. Reordering the conditions in a logical way makes it easier: x-1, x, x+1 combined
                            with y-1, y, y+1."




                            This..



                            var current = BorderPixels[Index];
                            var last = BorderPixels[LastIndex];
                            if (Math.Abs(current.X - last.X) <= 1 && Math.Abs(current.Y - last.Y) <= 1)

                            Possible.Add(Index);



                            replaces..




                            if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y + 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X - 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);
                            else if (new Vector2F(BorderPixels[LastIndex].X + 1, BorderPixels[LastIndex].Y - 1) == BorderPixels[Index])
                            Possible.Add(Index);







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited 30 mins ago

























                            answered 1 hour ago









                            dfhwzedfhwze

                            10.3k2 gold badges19 silver badges67 bronze badges




                            10.3k2 gold badges19 silver badges67 bronze badges






























                                draft saved

                                draft discarded
















































                                Thanks for contributing an answer to Code Review Stack Exchange!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid


                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.

                                Use MathJax to format equations. MathJax reference.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function ()
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f227130%2fordering-2d-border-points%23new-answer', 'question_page');

                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу

                                Israel Cuprins Etimologie | Istorie | Geografie | Politică | Demografie | Educație | Economie | Cultură | Note explicative | Note bibliografice | Bibliografie | Legături externe | Meniu de navigaresite web oficialfacebooktweeterGoogle+Instagramcanal YouTubeInstagramtextmodificaremodificarewww.technion.ac.ilnew.huji.ac.ilwww.weizmann.ac.ilwww1.biu.ac.ilenglish.tau.ac.ilwww.haifa.ac.ilin.bgu.ac.ilwww.openu.ac.ilwww.ariel.ac.ilCIA FactbookHarta Israelului"Negotiating Jerusalem," Palestine–Israel JournalThe Schizoid Nature of Modern Hebrew: A Slavic Language in Search of a Semitic Past„Arabic in Israel: an official language and a cultural bridge”„Latest Population Statistics for Israel”„Israel Population”„Tables”„Report for Selected Countries and Subjects”Human Development Report 2016: Human Development for Everyone„Distribution of family income - Gini index”The World FactbookJerusalem Law„Israel”„Israel”„Zionist Leaders: David Ben-Gurion 1886–1973”„The status of Jerusalem”„Analysis: Kadima's big plans”„Israel's Hard-Learned Lessons”„The Legacy of Undefined Borders, Tel Aviv Notes No. 40, 5 iunie 2002”„Israel Journal: A Land Without Borders”„Population”„Israel closes decade with population of 7.5 million”Time Series-DataBank„Selected Statistics on Jerusalem Day 2007 (Hebrew)”Golan belongs to Syria, Druze protestGlobal Survey 2006: Middle East Progress Amid Global Gains in FreedomWHO: Life expectancy in Israel among highest in the worldInternational Monetary Fund, World Economic Outlook Database, April 2011: Nominal GDP list of countries. Data for the year 2010.„Israel's accession to the OECD”Popular Opinion„On the Move”Hosea 12:5„Walking the Bible Timeline”„Palestine: History”„Return to Zion”An invention called 'the Jewish people' – Haaretz – Israel NewsoriginalJewish and Non-Jewish Population of Palestine-Israel (1517–2004)ImmigrationJewishvirtuallibrary.orgChapter One: The Heralders of Zionism„The birth of modern Israel: A scrap of paper that changed history”„League of Nations: The Mandate for Palestine, 24 iulie 1922”The Population of Palestine Prior to 1948originalBackground Paper No. 47 (ST/DPI/SER.A/47)History: Foreign DominationTwo Hundred and Seventh Plenary Meeting„Israel (Labor Zionism)”Population, by Religion and Population GroupThe Suez CrisisAdolf EichmannJustice Ministry Reply to Amnesty International Report„The Interregnum”Israel Ministry of Foreign Affairs – The Palestinian National Covenant- July 1968Research on terrorism: trends, achievements & failuresThe Routledge Atlas of the Arab–Israeli conflict: The Complete History of the Struggle and the Efforts to Resolve It"George Habash, Palestinian Terrorism Tactician, Dies at 82."„1973: Arab states attack Israeli forces”Agranat Commission„Has Israel Annexed East Jerusalem?”original„After 4 Years, Intifada Still Smolders”From the End of the Cold War to 2001originalThe Oslo Accords, 1993Israel-PLO Recognition – Exchange of Letters between PM Rabin and Chairman Arafat – Sept 9- 1993Foundation for Middle East PeaceSources of Population Growth: Total Israeli Population and Settler Population, 1991–2003original„Israel marks Rabin assassination”The Wye River Memorandumoriginal„West Bank barrier route disputed, Israeli missile kills 2”"Permanent Ceasefire to Be Based on Creation Of Buffer Zone Free of Armed Personnel Other than UN, Lebanese Forces"„Hezbollah kills 8 soldiers, kidnaps two in offensive on northern border”„Olmert confirms peace talks with Syria”„Battleground Gaza: Israeli ground forces invade the strip”„IDF begins Gaza troop withdrawal, hours after ending 3-week offensive”„THE LAND: Geography and Climate”„Area of districts, sub-districts, natural regions and lakes”„Israel - Geography”„Makhteshim Country”Israel and the Palestinian Territories„Makhtesh Ramon”„The Living Dead Sea”„Temperatures reach record high in Pakistan”„Climate Extremes In Israel”Israel in figures„Deuteronom”„JNF: 240 million trees planted since 1901”„Vegetation of Israel and Neighboring Countries”Environmental Law in Israel„Executive branch”„Israel's election process explained”„The Electoral System in Israel”„Constitution for Israel”„All 120 incoming Knesset members”„Statul ISRAEL”„The Judiciary: The Court System”„Israel's high court unique in region”„Israel and the International Criminal Court: A Legal Battlefield”„Localities and population, by population group, district, sub-district and natural region”„Israel: Districts, Major Cities, Urban Localities & Metropolitan Areas”„Israel-Egypt Relations: Background & Overview of Peace Treaty”„Solana to Haaretz: New Rules of War Needed for Age of Terror”„Israel's Announcement Regarding Settlements”„United Nations Security Council Resolution 497”„Security Council resolution 478 (1980) on the status of Jerusalem”„Arabs will ask U.N. to seek razing of Israeli wall”„Olmert: Willing to trade land for peace”„Mapping Peace between Syria and Israel”„Egypt: Israel must accept the land-for-peace formula”„Israel: Age structure from 2005 to 2015”„Global, regional, and national disability-adjusted life years (DALYs) for 306 diseases and injuries and healthy life expectancy (HALE) for 188 countries, 1990–2013: quantifying the epidemiological transition”10.1016/S0140-6736(15)61340-X„World Health Statistics 2014”„Life expectancy for Israeli men world's 4th highest”„Family Structure and Well-Being Across Israel's Diverse Population”„Fertility among Jewish and Muslim Women in Israel, by Level of Religiosity, 1979-2009”„Israel leaders in birth rate, but poverty major challenge”„Ethnic Groups”„Israel's population: Over 8.5 million”„Israel - Ethnic groups”„Jews, by country of origin and age”„Minority Communities in Israel: Background & Overview”„Israel”„Language in Israel”„Selected Data from the 2011 Social Survey on Mastery of the Hebrew Language and Usage of Languages”„Religions”„5 facts about Israeli Druze, a unique religious and ethnic group”„Israël”Israel Country Study Guide„Haredi city in Negev – blessing or curse?”„New town Harish harbors hopes of being more than another Pleasantville”„List of localities, in alphabetical order”„Muncitorii români, doriți în Israel”„Prietenia româno-israeliană la nevoie se cunoaște”„The Higher Education System in Israel”„Middle East”„Academic Ranking of World Universities 2016”„Israel”„Israel”„Jewish Nobel Prize Winners”„All Nobel Prizes in Literature”„All Nobel Peace Prizes”„All Prizes in Economic Sciences”„All Nobel Prizes in Chemistry”„List of Fields Medallists”„Sakharov Prize”„Țara care și-a sfidat "destinul" și se bate umăr la umăr cu Silicon Valley”„Apple's R&D center in Israel grew to about 800 employees”„Tim Cook: Apple's Herzliya R&D center second-largest in world”„Lecții de economie de la Israel”„Land use”Israel Investment and Business GuideA Country Study: IsraelCentral Bureau of StatisticsFlorin Diaconu, „Kadima: Flexibilitate și pragmatism, dar nici un compromis în chestiuni vitale", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 71-72Florin Diaconu, „Likud: Dreapta israeliană constant opusă retrocedării teritoriilor cureite prin luptă în 1967", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 73-74MassadaIsraelul a crescut in 50 de ani cât alte state intr-un mileniuIsrael Government PortalIsraelIsraelIsraelmmmmmXX451232cb118646298(data)4027808-634110000 0004 0372 0767n7900328503691455-bb46-37e3-91d2-cb064a35ffcc1003570400564274ge1294033523775214929302638955X146498911146498911

                                Кастелфранко ди Сопра Становништво Референце Спољашње везе Мени за навигацију43°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.5588543°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.558853179688„The GeoNames geographical database”„Istituto Nazionale di Statistica”проширитиууWorldCat156923403n850174324558639-1cb14643287r(подаци)