Fore example, user register to the game, and he gets coordinates (5;5).
Another user gets coordinates somewhere near user before, lets say (8;5), and so on. So all latest registered users are close to each other.
The question is - What is the best way to generate coordinate close to user before?
Sorry for bad english
First, you must defined how far a new user will appear and then, generate a position from an existing user.
As an example, let say there's a user in (2;6) and a new user register. You defined that the max distance the newly registered user will appear is 5 units. The position of the newly registered users will be something like :
x = 2 +/- random (0-5)
y = 6 +/- random (0-5)
This way, the new use may appear in (5;4), (7;2), (3;5).....
You should decide on what the distance of new user depends.
Case 1: All users spawn near some point, say (50;50) with max deviation of 25 on both axes.
Case 2: All users spawn near previous spawn point with some deviation.
Case 3: All users spawn near previous spawn point with deviation based on time of registration difference, for example if two users registered at the same moment, they will spawn at the same point, but if the second user spawned 2 minutes after the first, the deviation will be multiplied by 2.
Either way, you will have to save the last spawn point in order to calculate a new one from it.
As for what's best — you'll have to choose yourself.
Related
I have an app that will register the GPS coordinates on each check in made by the user. If the user comes back to make a new check in, as a speed saving option, we will show the closest place he had checked in.
Each check in will save the current position of the user, regardless if it is the first or 100th check in.
After some time we have a huge list of coordinates that we need to check each time.
How can I collapse this information? I want to turn a huge list of latitudes and longitudes into one or more polygons so I can speed up distance calculations.
# So this
1:0 100:200 2:0 2:2 2:1 1:1 2:1 0:1
# Could become this
100:200 1:1
# Or this
100:200,100:200 0:0,2:2
This is called the nearest neighbor search problem. You can have a look at the Wiki article which mentions faster algorithms. It seems that space partitioning with an R-Tree is the best approach.
I have the following problem and I am a bit clueless how to tackle it as my programming skills are very elementary ( I am an engineer, so please dont bite my head off).
Problem
I have a point cloud, the picture above displaying one level off it. Every point is a centroid off a block (x =5, y=1, z=5) and is specefied by carteisian coordinates.
The centroids further have two values: one called "access" and one "product". If the product value is positive and pays for the access to the point I want to include it in my outcome. The red marker in the picture represents a possible starting point.
Starting Idea
As a start I am trying to set up an algorithm, that starts at the red marker, runs through the blocks left and right (along the x-axis), checks until where it would be feasible to access (so sum "product" > sum "access") and then goes to the next point (in y direction from marker) and does the same until the end of the level.
Final Goal
My final goal is that I can Flag points as accessed and the algorithm connects profitable "products" (so products that would pay for their access) on the shortest way to the access point (by setting blocks/points on the way to accessed).
I know this is a very open question and I apologize for that. I am just lacking a good starting point programming wise. I was thinking of knnsearch, but I am not sure if this is the right way to go as the blocks have different sizes and i technically want the nearest neighbour in every direction but also only one per direction.
Another idea I had was using shortestpath or creating a travel salesman problem out of it, but I am not sure how to properly implement it.
If you have any ideas or you could offer any help I would very much appreciate it. If any more information is needed I gladly provide it.
I am working on Unity, using C# for a project that should be quite simple.
I am stuck to pathFinding .
I have Looked at Dikjstra's and A* for reference, but for some reason I still can't adopt them to work in my case. I guess my brain :=while(1);
Here is the Idea:
From a textfile I import a "map" where each "*" means Wall, and each " " walkarea. In the map there area randomly placed 2 objects: a bomb and an agent.
The agent must investigate the map (which forms a maze) and discover the bomb. The agent may move to his 8 neighbour tiles if they are NOT Wall. In my code , the agent class hold his own map. for every tile that he visits, he asks the "world map" for info, about his 8 neighbour tiles.
On his own map then he takes a note of the known tiles type(wall / walkpath) , and if it is a walkpath, he also notes, how many times he has visited it. The agent also has a "Prefered direction " list. This tells which tile to choose next to move to, if more than 1 have not been visited.
Up to this point, I have set it up all good and running, and if I let it run, he eventually finds the bomb. The Issue is that because he only runs on a Prefered direction according to the least visited tile , he has to re-visit some tiles too many times like a moron. So what
I must do is this:
If the agent reaches a tile for which, every nighbour is either wall or already visited, then he should investigate his own map, and the notes from the past to find an unvisited tile , and walk to there. Every walk direction has the same weight/cost, so we don't need to consider cost of path.
In my opinion, Dijkstra's is the closest to apply , but I still can't get it right .
Any Ideas or help would be much appreciated.
Thank You
Alex
Part of the issue is how much information you want to allow your agent. If you're willing to let him know where the target is, or at least its general direction in relation to himself, then you can use that to help influence the agent's decisions. This would allow you him to always favor moving in the direction that gets him closest to the goal while taking the least visited path.
Otherwise I'd keep track of each place he visited in a separate map, as well as the 8 neighboring tiles since he has "seen" them, with something like -1 indicating a wall that has been seen, -2 indicating an unseen location, and 0 indicating seen but unvisited. I'd then use A* or a variant on it that would move him to the closest unvisited point based on number of tiles traversed, breaking ties randomly. This would lead to a more trial and error rat in a maze approach.
I am developing one iphone application which contains maps. Starting screen is navigation screen where user can select location, lets say florida. Now when User selects florida i want to pick up at least six random points (latitude and longitude of points so that I can put annotation) from florida only.
I do not have DB so that I can not fetch 5 points from DB for florida and place them.
Any ideas?
Thanks,
This is going to be quite hard if you don't have anything to tell you the shape and size of the area you are trying to produce random points within. Harikrishnan had given you a good start, though increasing the lat and long by 0.0001 each time is hardly random. At Florida's coordintes (28.0908° N, 81.9604° W according to Google) moving 0.0001 in both directions is only 14m away, so you're unlikely to leave Florida at that speed.
You could adjust Harikirshnan's method by using a random number instead of 0.0001, but you still need to know how big the area is that your user is looking at. Having 5 points all 14m when you're looking at a state, or even a city, is not much good.
Maybe you need to look more closely at what you are trying to achieve. If the points don't represent geographical data then why are you putting them on a map. If they do and they represent the entire area and not a single point then the best I can think of is to generate random points based on the maprect that Apple returns for the location the user has chosen. (roughly speaking that would be mapX = random*maprect.size.width + maprect.origin.x). And then incase you have an area like Florida that is not perfectly shaped like your MKMapView you'd need to reverse geocode to see if the point you picked really is within Florida (i.e. send the coords to Apple and check the address).
Or, you could consider now showing the data on the map
Try this
NSInteger i;
double offset=0.0001;
for(i=1;i<=5;i++){
double newlatitude=location.coordinate.longitude+offset;
double newlongitude=location.coordinate.longitude+offset;
NSLog(#"%f ,%f",newlatitude,newlongitude );
offset+=0.0001;
}
I have a database with the current coordinates of every online user. With a push of a button the user can update his/her coordinates to update his current location (which are then sent off to server). The app will allow you to set the radius of a circle (where the user is in the center) in which you can see the other users on a map. The users outside the circle are discarded.
What is the optimal way to find the users around you?
1) The easiest solution is to find the distance between you and every user and then see if it's less than the radius. This would place the sever under unnecessarily great load as comparison has to be made with every user in the world. In addition, how would one deal with changes in the locations?
2) An improved way would be to only calculate and compare the distance with other users who have similar latitude and longitude. Again in order to be efficient, if the radius is decreased the app should only target users with even closer coordinates. This is not as easy as it sounds. If one were to walk around the North Pole with, say, 10m radius then every step around the circumference would equal to a change of 9 degrees longitude. Every step along the equator would be marginal. Still, even being very rough and assuming there aren't many users visiting the Poles I could narrow it down to some extent.
Any ideas regarding finding users close-by and how to keep them up to date would be much appreciated! :)
Andres
Very good practice is to use GeoHash concept (http://geohash.org/) or GeoModel http://code.google.com/p/geomodel/ (better for BigTable like databases). Those are efficient ways of geospatial searches. I encourage you to read some of those at links I have provided, but in few words:
GeoHash translates lon and lat to unique hash string, than you can query database through those hashes. If points are closer to each other similar prefix will bi longer
GeoModel is similar to GegoHash with that difference that hashed are squares with set accuracy. If square is smaller the hash is longer.
Hope I have helped you. But decision, which you will pick, is yours :).
Lukasz
1) you would probably need a two step process here.
a) Assuming that all locations go into a database, you can do a compare at the sql level (very rough one) based on the lat & long, i.e. if you're looking for 100m distances you can safely disregard locations that differ by more than 0.01 degree in both directions. I don't think your North Pole users will mind ;)
Also, don't consider this unnecessary - better do it on the server than the iPhone.
b) you can then use, for the remaining entries, a comparison formula as outlined below.
2) you can find a way to calculate distances between two coordinates here http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/
The best solution currently, in my opinion, is to wrap the whole earth in a matrix. Every cell will cover a small area and have a unique identifier. This information would be stored for every coordinate in the database and it allows me to quickly filter out irrelevant users (who are very far away). Then use Pythagoras to calculate the distance between all the other users and the client.