diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a470a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +build/ +voronoi2 diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 884d5dd..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Voronoi2 - 1", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/voronoi2", - "args": ["1", "pp_inside.txt", "output.txt"], - "stopAtEntry": false, - "cwd": "${fileDirname}", - "environment": [], - "externalConsole": false, - "MIMode": "gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] - }, - { - "name": "Voronoi2 - 2", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/voronoi2", - "args": ["2", "pp_inside.txt", "polygon_square.txt", "output.txt"], - "stopAtEntry": false, - "cwd": "${fileDirname}", - "environment": [], - "externalConsole": false, - "MIMode": "gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 14004e0..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "type_traits": "c" - } -} \ No newline at end of file diff --git a/Makefile b/Makefile index e196e78..e0c4d2b 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,15 @@ -# Link command: -voronoi2: common.o towers.o dcel.o voronoi.o input.o main.o - gcc -Wall -Wextra -Werror -pedantic -g -o voronoi2 main.o input.o voronoi.o dcel.o towers.o common.o -lm - -# Compilation commands -common.o: common.c - gcc -Wall -Wextra -Werror -pedantic -g -o common.o common.c -c - -towers.o: towers.c - gcc -Wall -Wextra -Werror -pedantic -g -o towers.o towers.c -c - -dcel.o: dcel.c - gcc -Wall -Wextra -Werror -pedantic -g -o dcel.o dcel.c -c - -voronoi.o: voronoi.c - gcc -Wall -Wextra -Werror -pedantic -g -o voronoi.o voronoi.c -c - -input.o: input.c - gcc -Wall -Wextra -Werror -pedantic -g -o input.o input.c -c - -main.o: main.c - gcc -Wall -Wextra -Werror -pedantic -g -o main.o main.c -c +BUILDDIR=$(CURDIR)/build +NAME=voronoi2 + +$(NAME): build/common.o build/towers.o build/dcel.o build/voronoi.o build/input.o build/main.o | $(BUILDDIR) + gcc -Wall -Wextra -Werror -pedantic -g -o $(NAME) $^ -lm + +build/%.o: src/%.c + gcc -Wall -Wextra -Werror -pedantic -g -c $< -o $@ + +$(BUILDDIR): + mkdir -p $(BUILDDIR) + +clean: + @rm -rf build + @rm -f $(NAME) diff --git a/README.md b/README.md index c224aca..84c4a24 100755 --- a/README.md +++ b/README.md @@ -1 +1 @@ -## COMP20003 Assignment 2 +## COMP20003 Assignment 2 - Voronoi Diagrams diff --git a/common.o b/common.o deleted file mode 100644 index 734d90f..0000000 Binary files a/common.o and /dev/null differ diff --git a/dcel.o b/dcel.o deleted file mode 100644 index a271dd5..0000000 Binary files a/dcel.o and /dev/null differ diff --git a/docs/SPECIFICATION.md b/docs/SPECIFICATION.md new file mode 100644 index 0000000..08e21a9 --- /dev/null +++ b/docs/SPECIFICATION.md @@ -0,0 +1,448 @@ +--- + +--- + +# Assignment Specification + +Below is the assignment specification, in full, slightly edited for context and appearence. + +## Voronoi Diagram: The Fundamentals + +In the [first assignment](https://git.roryhealy.dev/unimelb-projects/comp20003-project01), the DCEL was implemented. We used it to store the regions each watchtower was responsible for. However, if you are given a point location, how do you find the nearest watchtower? An obvious solution is to compute the distance to all watchtowers and to select afterward the closest one (pick one randomly if there is more than one). This works fine if you have a single query but the cost is of course $O(mn)$ for $m$ queries if there are $n$ watchtowers. + +An alternative approach is to precompute the region of all points that is closer to a watchtower than to all other watchtowers. This region is called the *Voronoi region* or *Voronoi cell* of that watchtower. If we computed the Voronoi cell for each watchtower (note that this region is unique), then we could simply lookup the region that contains our location and know the responsible watchtower. The planar subdivision of all Voronoi cells is called the ***Voronoi*** ***diagram***. + +### Bisector + +An important concept for Voronoi diagrams is the bisector of two points. The bisector is orthogonal to the line segment connecting the two points and is equidistant to both points. If you had a compass, you would simply center the compass on each site, draw a circle (it does not have to have the other site on its circumference but the circles need to overlap to generate at least one intersection). Of course, for an implementation, we need an actual formula. The point $S_m$ is easy to compute as it is just the midpoint of $S_1$​ and $S_2$, which is calculated as: + +$$ +S_m = \bigg(\frac{S_{1x} + S_{2x}}{2}, \frac{S_{1y} + S_{2y}}{2}\bigg) +$$ + +The actual bisector is just a usual straight line and its formula is: + +$$ +y = -\frac{S_{2x} - S_{1x}}{S_{2y} - S_{1y}} \times (x - S_{mx}) + S_{my} +$$ + +![](./images/image01.png) + +Note that every point on the bisector is equidistant to the sites $S_1$​ and $S_2$​. In particular, it divides the line segment $\overline{S1S2}$ into two equal halves at point $S_m$​. Finally, the line segment $\overline{S1S2}​​$ is orthogonal to the bisector $b_{12}$​. + +### Voronoi cell + +In this assignment, we will use the DCEL to store the Voronoi diagram. More formally, in general we have $n$ sites $S_1, \dots, S_n$​ (our watchtowers), then the ***Voronoi cell*** of a site $S_i$​ for a given region $R$ (say Victoria) is defined as the set of points $P$ in the given region $R$ that fulfil the following condition: + +```math +VC(S_i) = \{P \in R\ |\ dist(P, S_i) \lt dist(P, S_j)\ \forall\ S_j,\ j \neq i \} +``` + +$dist(\sdot,\ \sdot)$ is the usual Euclidean distance between two points. + +### Voronoi edges and Voronoi vertices + +A shared edge between two Voronoi cells is called a ***Voronoi edge***. If $S_i$​ and $S_j$​ are two sites whose Voronoi cells share an edge $e_{ij}$​, then all the points on $e_{ij}$​ are equidistant to $S_i$​ and $S_j$​. This means that a Voronoi edge is part of the perpendicular bisector between two sites $S_i$ and $S_j$​. Voronoi cells can share at most one Voronoi edge. In the figure the sites $S_0$​ and $S_4$ share edge $e_{04}$​. + +A point at which the edges of three (or more) Voronoi cells meet is called a ***Voronoi vertex***. If $S_i$​, $S_j$​ and $S_k$​ are three sites with shared Voronoi edges $e_{ij}$​, $e_{ik}$,​ and $e_{jk}$​ that meet in $V_{ijk}$​, then the Voronoi vertex is the circumcentre of the triangle with vertices $S_i$​, $S_j$​ and $S_k$​, because the points $S_i$​, $S_j$​ and $S_k$​ are all equidistant to $V_{ijk}$​.​ + +For example, the vertex $V_{234}$​ is shared by the edges $e_{23}$​, $e_{24}$​ and $e_{34}$​ in the figure below: + +![](./images/image02.png) + +Usually, there are two types of Voronoi edges: those that connect two Voronoi vertices and those start from a single vertex and are unbounded (i.e., are infinite). We will assume a (convex) polygon around our Voronoi sites, which clips all infinite edges. This means you can assume that all Voronoi edges are bounded and you use for the second point on the edge simply the intersection points of the polygon with the Voronoi edges. + +In the figure above, the Polygon is defined by the points $A$ to $P$ and the unbounded Voronoi edges $e_{01}$​, $e_{02}$​, $e_{23}$​, $e_{13}$ are described as line segments $\overline{V_{014}P_{01}}$​​, $\overline{V_{024}P_{02}}$​​, $\overline{V_{234}P_{23}}$​​, $\overline{V_{134}P_{13}}$​​, respectively. + +By the way: there are as many Voronoi cells as we have sites, and if we have $n$ sites, then there are $O(n)$ vertices and edges. + +If we had two sites $S_1$ and $S_2$​, what would the Voronoi diagram look like assuming a bounding rectangle as a polygon? Here is an example: + +![](./images/image03.png) + +The two Voronoi cells are simply the result of inserting the bisector between those two sites. All the points in the green cell are closer to the left site, and all the points in the purple cell are closer to right site. In the next figure, we have inserted a third site. Since we have three sites, we get exactly one Voronoi vertex. + +![](./images/image04.png) + +We insert another site and obtain four Voronoi cells + +![](./images/image05.png) + +After inserting another site, we get the first Voronoi cell that has no infinite edges (the brown cell). + +![](./images/image06.png) + +This is the Voronoi diagram after inserting 20 more sites (25 in total): + +![](./images/image07.png) + +[Here](./videos/voronoi.mp4) is a video that shows that the insertion of another site only impacts a few selected Voronoi cells in its neighborhood. + +A final note: finding the Voronoi cell for a given point location can be achieved in $O(\log ⁡n)$ time given $n$ sites. The reason is that every Voronoi cell is convex. However, we will not implement this algorithm here but it shows that the original problem of locating $m$ points - stated in the introduction above - can be done in $O(m\log n)$. + +## Task 1: Compute and output equations for bisectors + +The description above motivated the use of an incremental algorithm to compute the Voronoi diagram. We first build the Voronoi diagram for 3 sites through the use of bisectors. Bisectors were described in the previous entry. Your task is to compute and output equations for bisectors given pairs of points in a file. + +Your implementation will receive three arguments, one for the stage and two filenames. The first filename argument is a file that will contain a list of point pairs, one pair per line where the $x$ and $y$ coordinates are separated by a blank. The second filename argument is an output file that contains the equations for all bisectors. + +### Example + +The point pairs file [pp_inside.txt](../test/data/point-pairs/pp_inside.txt) contains the following point pairs: + +``` +145.6 -34.2 145.6 -35.2 +145.6 -34.2 145.6 -36.2 +145.6 -35.2 148.6 -35.2 +147.6 -35.2 146.6 -35.2 +148.6 -35.2 146.6 -35.2 +148.6 -34.2 146.6 -32.2 +``` + +After running `./voronoi2 1 pp_inside.txt 1-outfile-inside.txt` the contents of `1-outfile-inside.txt` would be: + +``` +y = 0.000000 * (x - 145.600000) + -34.700000 +y = 0.000000 * (x - 145.600000) + -35.200000 +x = 147.100000 +x = 147.100000 +x = 147.600000 +y = 1.000000 * (x - 147.600000) + -33.200000 +``` + +## Task 2: Compute and output intersection points for bisectors against a given polygon + +In this task you will output the intersections between bisectors and a given polygon. Your implementation will receive four arguments, one representing the task number and three filenames. The first filename argument is a file that will contain a list of point pairs, one pair per line where the $x$ and $y$ coordinates are separated by a blank. The second argument is a file that will contain the initial polygon to be stored as a DCEL. The third argument is an output file that contains all intersections of the bisectors with the provided polygon. These will specify which edge in the DCEL the bisectors intersected, and the points these occurred at. + +### Provided intersection code + +[This](./intersection.c) provided intersection code is non-trivial, and even a single error is difficult to spot visually. We have provided this code for you here, you are welcome to treat it as a magic black box - the areas to fill in are `...`. You just need to add in your half-edges start and end, and bisector segment start and end. This gives a more detailed diagnosis, but it is sufficient to check if it `DOESNT_INTERSECT` to determine intersection. + +### Example + +The point pairs file [pp_inside.txt](../test/data/point-pairs/pp_inside.txt) contains the following point pairs: + +``` +145.6 -34.2 145.6 -35.2 +145.6 -34.2 145.6 -36.2 +145.6 -35.2 148.6 -35.2 +147.6 -35.2 146.6 -35.2 +148.6 -35.2 146.6 -35.2 +148.6 -34.2 146.6 -32.2 +``` + +The polygon file [polygon_square.txt](../tests/data/polygons/polygon_square.txt) contains the following coordinates: + +``` +140.9 -39.2 +140.9 -33.9 +150.0 -33.9 +150.0 -39.2 +``` + +After running `./voronoi2 2 pp_inside.txt polygon_square.txt 2-outfile.txt` the contents of `2-outfile.txt` would be: + +``` +From Edge 0 (140.900000, -34.700000) to Edge 2 (150.000000, -34.700000) +From Edge 0 (140.900000, -35.200000) to Edge 2 (150.000000, -35.200000) +From Edge 1 (147.100000, -33.900000) to Edge 3 (147.100000, -39.200000) +From Edge 1 (147.100000, -33.900000) to Edge 3 (147.100000, -39.200000) +From Edge 1 (147.600000, -33.900000) to Edge 3 (147.600000, -39.200000) +From Edge 1 (146.900000, -33.900000) to Edge 3 (141.600000, -39.200000) +``` + +## Task 3: Computation of the Voronoi Diagram + +### An incremental algorithm to compute the Voronoi diagram + +How do we enhance our algorithm to work with $n \gt 3$ sites assuming we have a Voronoi diagram for 3 sites already? The algorithm works as follows: assume a new site $S_m$ (see the figure below) is inserted into a Voronoi diagram that has already $k$ sites. The Voronoi cell of $S_m$ is then created as follows: + +- Find the Voronoi cell $VC(S_i)$ that contains $S_m$. + +- Compute the bisector $b_{im}$ of $S_i$ and $S_m$. + +- The bisector $b_{im}$ intersects two edges of $V(S_i)$, say $e_{i_0}$ and $e_{i_1}$ in counter-clockwise direction. + +- If both edges are Voronoi edges (i.e., have a twin (opposite, pair) edge), then the algorithm proceeds as follows: + + - Store the new Voronoi edge of $VC(S_m)$ that connects $e_{i_0}$ and $e_{i_1}$ at their intersection points. + + - Retrieve the Voronoi site using the DCEL of the edge $e_{i_1}$, say $S_{i_1}$. + + - Process the second edge intersection (in counter-clockwise direction) compute the second edge of $S_{i_0}$ that intersects $b_{{i_1}m}$, say $e_{i_2}$. + + - If the next edge is also a Voronoi edge, retrieve the Voronoi site using the DCEL of the edge $e_{i_2}$, say $S_{i_2}$. If every encountered edge is a Voronoi edge, repeat the algorithm until $e_{i_j} = e_{i_0}$. + + - If the algorithm intersects at any stage an edge that is not a Voronoi edge, i.e., an edge of the enclosing polygon, it terminates this search for further Voronoi edges. *Note that could happen even at the beginning and we will have only Voronoi vertex because the Voronoi cell would be unbounded if we did not assume an initial polygon.* + + - Instead, the algorithm may intersect a non-Voronoi edge and continue its search along the initial polygon and terminates its search until it visits $e_{i_0}$ again. + +### Incrementally updating the DCEL + +Of course you need to update all edges in the DCEL, whenever you compute an edge for $S_m$. You will also need to delete all old Voronoi vertices that are enclosed by the new Voronoi cell $VC(S_m)$. There are basically two cases that will happen: + +- The bisector intersects two edges that are adjacent, i.e., share a single vertex. Then you need to delete the shared vertex, split the intersected edges and store the updated edges for the Voronoi cell that is intersected by the bisector. + +- The bisector intersects two non-adjacent edges. Then you need to traverse all edges -- starting from the second intersected edges -- in clockwise order using the *.next* operation until you encounter the first intersected edge. All edges and their shared vertices have to removed. Then you need to split the intersected edges as before and and store the updated edges for the Voronoi cell that is intersected by the bisector. + +Finally, you need to insert the new site into the DCEL including the new edges and their start points. + +### Manual example + +In the example below we have already 5 existing sites $S_0, \dots, S_4$ and wish to insert site $S_5$. + +- In the first step we compute that $S_5$ is in $VC(S_4)$ and compute the bisector of $S_5$ and $S_4$, which intersects the edges $e_{24}$ and $e_{14}$ in counter-clockwise order. + +- Since $e_{14}$ is the edge between $S_4$ and $S_1$, we compute the bisector between $S_1$ and $S_5$, which intersects edge $e_{13}$. This implies that the next site is $S_3$. + +- We then apply the algorithm and compute the next intersection of the bisector of $S_5$ and $S_3$, which is the edge $e_{23}$. Thus, the next site is $S_2$ and the intersection of the bisector $S_5$ and $S_2$ is the edge $e_{24}$. + +- Since we have discovered the edge $e_{24}$ before, the algorithm terminates. + +We now have to update all purple edges (and vertices), and have to insert the new edges, highlighted as dashed edges. + +- This means that we have to delete the vertices $V_{134}$ and $V_{234}$. + +- We also have to delete the edge $e_{34}$ connecting $V_{134}$ and $V_{234}$. + +- Finally, we have to apply the corresponding split operations you have studied in assignment 1 on $e_{24}$, $e_{34}$ and $e_{14}$. + +- Finally, we insert the new dashed edges $e_{45}$, $e_{25}$, $e_{35}$ and $e_{15}$ into the DCEL for the Voronoi cell $VC(S_5)$. + +![](./images/image08.png) + +### The diameter of a Voronoi cell + +You will need to retrieve all Voronoi cells from the DCEL and compute their diameter. The ***diameter*** of a set $S$ is the least upper bound of all distances between point pairs in $S$. Fortunately, all Voronoi cells are convex polygons (remember that a set is convex if for every point pair the segment connecting the points is also in the set). This means that the diameter is easy to compute: + +You just need to compute the distances of all pairs of vertices of a Voronoi cell and select the largest distance. + +It is clear that this algorithm has quadratic complexity in the number of vertices of a Voronoi cell and we have n Voronoi cells for n sites. + +If you are curious: there are faster ways to compute the diameter of a Voronoi cell (or in fact any convex polygon) that are based on the concept of supporting lines. However, this proved to be more difficult than initially thought and a few incorrect algorithms have been published as a consequence! This shows again how important it is to verify the correctness of your algorithms. You can find more information about this [here](http://cgm.cs.mcgill.ca/~athens/cs507/Projects/2000/MS/diameter/node4.html). + +### Your task + +Your task is to compute the Voronoi diagram iteratively. In addition to the argument specifying your program should run task 3, your implementation will receive three filenames as an arguments and will build the Voronoi diagram reading from the first two files and outputting the site/watchtower data and the diameter of each Voronoi cell to the output file. + +- The first file contains all Voronoi sites, i.e., the watchtower from the first assignment, again stored in csv format, one per line, representing the fields associated with each site. Again, your program must read in the records line by line. + +- The second file will contain a list of $(x, y)$ coordinates that describe the vertices of a region $R$ (such as the state of Victoria) as a polygon. Each vertex $(x, y)$ of the region's boundary is stored on a separate line. The coordinates are separated by a space on each line. + +- After processing the second input file, a Voronoi diagram is constructed, separating all points into their own cell with all points in the cell being closest to the site/watchtower in the cell. The site/watchtower data and its diameter(s) are written to the output file. + +#### Note + +The algorithm described above makes a few assumptions to avoid dealing with special cases: + +- Not three watchtowers are collinear. + +- No Voronoi vertex has more than three Voronoi edges. + +- The initial polygon is large enough to contain all Voronoi vertices. + +### Example + +When run with the number 3 as the first argument, your program should take four arguments. The first argument is this task indicator. The other three arguments are files with the same meaning as the first assignment. The second argument will be the filename of a csv-format list of watchtowers with the same structure as the first assignment, the third argument will be a list of points, one per line, with each coordinate separated by a single space. The fourth argument will be the file to output to. + +The watchtower file [dataset_3.csv](../tests/data/watchtowers/dataset_3.csv) contains the following information: + +```csv +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +``` + +The polygon file [polygon_square.txt](../tests/data/polygons/polygon_square.txt) contains the following coordinates: + +``` +140.9 -39.2 +140.9 -33.9 +150.0 -33.9 +150.0 -39.2 +``` + +After running `./voronoi2 3 dataset_3.csv polygon_square.txt 3-outfile.txt` the contents of `3-outfile.txt` would be: + +``` +Watchtower ID: WT3953SGAEI, Postcode: 3953, Population Served: 1571, Watchtower Point of Contact Name: Ofelia Kadlec, x: 145.778002, y: -38.559840, Diameter of Cell: 7.144748 +Watchtower ID: WT3765SHSPB, Postcode: 3765, Population Served: 3380, Watchtower Point of Contact Name: Eilene Horner, x: 145.362014, y: -37.818943, Diameter of Cell: 9.518041 +Watchtower ID: WT3530RJWDT, Postcode: 3530, Population Served: 63, Watchtower Point of Contact Name: Troy Clark, x: 143.083467, y: -35.792994, Diameter of Cell: 7.935830 +``` + +Note the addition of the **Diameter of Cell** field. + +## Task 4: Computing the diameter of all Voronoi cells and sort them in ascending order by diameter + +Your task has the same input and output files as Task 3 but this time you need to output the sites/watchtowers in order of the length of the diameter of their corresponding Voronoi cell in ascending order, i.e., smallest to largest. Your sorting algorithm has to be stable, which means that for two sites with equal diameter the one with a smaller ID is stored first. + +To sort the Voronoi cells by diameter, you will implement *Insertion Sort*. Here is its pseudocode (note that the ⟵ sign is used to assign values to a variable): + +``` +InsertionSort(A[0..n - 1]) + +for i ⟵ 1 to n - 1 do + + v ⟵ A[i] + j ⟵ i – 1 + + while j >= 0 and A[j] > v do + A[j + 1] ⟵ A[j] + j ⟵ j - 1 + + A[j + 1] ⟵ v +``` + +The idea of *Insertion Sort* is that we assume that a smaller problem of sorting the array `A[0..k - 2]` has already been solved. We take advantage of that and simply insert a new element `A[k - 1]` at the appropriate position so that the array `A[0..k − 1]` is now sorted. Note that the basic operation is the key comparison `A[j] > v`. Please convince yourself that this algorithm is indeed stable. + +### Example + +The watchtower file [dataset_3.csv](../tests/data/watchtowers/dataset_3.csv) contains the following information: + +```csv +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +``` + +The polygon file [polygon_square.txt](../tests/data/polygons/polygon_square.txt) contains the following coordinates: + +``` +140.9 -39.2 +140.9 -33.9 +150.0 -33.9 +150.0 -39.2 +``` + +After running `./voronoi2 4 dataset_3.csv polygon_square.txt 4-outfile.txt` the contents of `4-outfile.txt` would be: + +``` +Watchtower ID: WT3953SGAEI, Postcode: 3953, Population Served: 1571, Watchtower Point of Contact Name: Ofelia Kadlec, x: 145.778002, y: -38.559840, Diameter of Cell: 7.144748 +Watchtower ID: WT3530RJWDT, Postcode: 3530, Population Served: 63, Watchtower Point of Contact Name: Troy Clark, x: 143.083467, y: -35.792994, Diameter of Cell: 7.935830 +Watchtower ID: WT3765SHSPB, Postcode: 3765, Population Served: 3380, Watchtower Point of Contact Name: Eilene Horner, x: 145.362014, y: -37.818943, Diameter of Cell: 9.518041 +``` + +## Plagarism + +This is an individual assignment. The work must be your own. + +While you may discuss your program development, coding problems and experimentation with your classmates, you must not share files, as this is considered plagiarism. + +If you refer to published work in the discussion of your experiments, be sure to include a citation to the publication or the web link. + +“Borrowing” of someone else’s code without acknowledgment is plagiarism. Plagiarism is considered a serious offense at the University of Melbourne. You should read the University code on Academic integrity and details on plagiarism. Make sure you are not plagiarizing, intentionally or unintentionally. + +You are also advised that there will be a C programming component (on paper, not on a computer) in the final examination. Students who do not program their own assignments will be at a disadvantage for this part of the examination. + +## Late Policy + +The late penalty is 10% of the available marks for that project for each day (or part thereof) overdue. Requests for extensions on medical grounds will need to be supported by a medical certificate. Any request received less than 48 hours before the assessment date (or after the date!) will generally not be accepted except in the most extreme circumstances. In general, extensions will not be granted if the interruption covers less than 10% of the project duration. Remember that departmental servers are often heavily loaded near project deadlines, and unexpected outages can occur; these will not be considered as grounds for an extension. + +Students who experience difficulties due to personal circumstances are encouraged to make use of the appropriate University student support services, and to contact the lecturer, at the earliest opportunity. + +Finally, we are here to help! There is information about getting help in this subject on the LMS. Frequently asked questions about the project will be answered on Ed. + +## Requirements + +The following implementation requirements must be adhered to: + +- You must write your implementation in the C programming language. + +- You must write your code in a modular way, so that your implementation could be used in another program without extensive rewriting or copying. This means that the Doubly Connected Edge List operations are kept together in a separate .c file, with its own header (.h) file, separate from the main program. + +- Your implementation must read the input file once only. + +- Your program should store strings in a space-efficient manner. If you are using malloc() to create the space for a string, remember to allow space for the final end of string ‘\0’ (NULL). + +- A full Makefile is not provided for you. The Makefile should direct the compilation of your program. To use the Makefile, make sure it is in the same directory as your code, and type `make voronoi2` to make the dictionary. You must submit your makefile with your assignment. + +- Comments should be present in your code and aim to be useful for the target audience of your code, so should be in English, and can assume functional understanding of C and its library functions. + +Hint: If make doesn’t work, read the error messages carefully. A common problem in compiling multifile executables is in the included header files. Note also that the whitespace before the command is a tab, and not multiple spaces. It is not a good idea to code your program as a single file and then try to break it down into multiple files. Start by using multiple files, with minimal content, and make sure they are communicating with each other before starting more serious coding. + +## Hints + +### Starting Voronoi diagrams + +The first three steps in creating the Voronoi diagram are simple enough, but may need careful care: + +1. For the first tower (or Voronoi site), can simply be stored in the face (and the reverse). + +2. For the second tower (or Voronoi site), we have a special case, as the fact that there is only a single face doesn't alone determine whether we are inserting the first or second tower, so you'll need to check. + +3. After inserting the first two towers, the third and beyond can simply check the number of faces. + +### Splits + +If you used a mid-point vertex, you can use the split process from Assignment 1 to perform your splitting, simply set the position of these vertices to the location of the splits instead of the midpoint, the rest of the logic will work out. + +### Constructing new faces for Voronoi cells + +The face you construct following the algorithm must be connected together, a few parts of the process can significantly simplify this process. + +- When using splits to construct the geometry, order the start and end edges in the split such that the watchtower is *outside the half-edge by the half-plane test*. This allows you to record the number of faces initially, perform all the splits, and then you know every face which will ultimately form the new face. + +- Because of recommended choices during the previous assignment, each new face created will have a pointer to its half-edge in the DCEL, this means you can connect these directly. + +### Cleaning contained geometry + +After incremental Voronoi algorithm has completed, there will be edges in your DCEL which go unused, these don't do any harm, but may cause confusion if you want to visualise your progress. A simple process for cleaning up the contained geometry also allows us to connect all faces in the Voronoi cell. + +- For each of the new faces, traverse all half-edges until you reach the original half-edge, update as you traverse with the following rules: + + - (Pink Half-Edge) If a half-edge's pair/twin/opposite half-edge is in a face which is one of the new faces created, or has been assigned to be not in any face (e.g. `NOFACE` in the sample solution), and its following half-edge's pair/twin/opposite is `NULL` (one of the polygon initial half-edges, in green without pair), or joins to a face which is not one of the new faces (one of the joining half-edges, marked in green with black pair), then connect the *previous* pointer of the following edge (green) to the pair (orange)'s preceding half-edge (green in the other face). Set the face of the half-edge to not in any face. + + - (Orange Half-Edge) If a half-edge's pair/twin/opposite half-edge is in a face which is one of the new faces created, or has been assigned to be not in any face (e.g. `NOFACE` in the sample solution), and its preceeding half-edge's pair/twin/opposite is `NULL` (one of the polygon initial half-edges, in green without pair), or joins to a face which is not one of the new faces (one of the joining half-edges, marked in green with black pair), then connect the *next* pointer of the preceding half-edge (green) to the pair (pink)'s following half-edge (green in the other face). Set the face of the half-edge to not in any face. + + - (Blue and Light Blue Half-Edges) If the half-edge's pair/twin/opposite is in a face which is one of the new faces, set this half-edge's face to not in any face. + + - (Green Half-Edges) Otherwise, set the half-edge's face to the stored new face value. + +![](./images/image09.png) + +- After the traversal is complete, set the deleted faces to longer point to their half-edges. + +### Helper functions + +You may find functions to make traversing the DCEL easier useful, e.g. find next face, find next half-edge, etc. + +## Programming Style + +[This](./programming-style.c) is a style guide which assignments are evaluated against. For this subject, the 80 character limit is a guideline rather than a rule - if your code exceeds this limit, you should consider whether your code would be more readable if you instead rearranged it. + +Some automatic evaluations of your code style may be performed where they are reliable. As determining whether these style-related issues are occurring sometimes involves non-trivial (and sometimes even undecidable) calculations, a simpler and more error-prone (but highly successful) solution is used. You may need to add a comment to identify these cases, so check any failing test outputs for instructions on how to resolve incorrectly flagged issues. + +## Additional Support + +Your tutors will be available to help with your assignment during the scheduled workshop times. Questions related to the assignment may be posted on the Ed discussion forum, using the folder tag Assignments for new posts. You should feel free to answer other students’ questions if you are confident of your skills. + +A tutor will check the discussion forum regularly, and answer some questions, but be aware that for some questions you will just need to use your judgment and document your thinking. For example, a question like, “How much data should I use for the experiments?”, will not be answered; you must try out different data and see what makes sense. + +If you have questions about your code specifically which you feel would reveal too much of the assignment, feel free to post a private question on the discussion forum. + +## Submission + +Your C code files (including your Makefile and any other files needed to run your code) should be submitted through Ed to this assignment. Your programs must compile and run correctly on Ed. You may have developed your program in another environment, but it still must run on Ed at submission time. For this reason, and because there are often small, but significant, differences between compilers, it is suggested that if you are working in a different environment, you upload and test your code on Ed at reasonably frequent intervals. + +A common reason for programs not to compile is that a file has been inadvertently omitted from the submission. Please check your submission, and resubmit all files if necessary. + +## Assessment + +There are a total of 15 marks given for this assignment. + +Your C program will be marked on the basis of accuracy, readability, and good C programming structure, safety and style, including documentation (1 mark). Safety refers to checking whether opening a file returns something, whether mallocs do their job, etc. The documentation should explain all major design decisions, and should be formatted so that it does not interfere with reading the code. As much as possible, try to make your code self-documenting, by choosing descriptive variable names. The remainder of the marks will be based on the correct functioning of your submission. + +Note that these correct functioning-related marks will be based on passing various tests. If your program passes these tests without addressing the learning outcomes (e.g. if you fully hard-code solutions or otherwise deliberately exploit the test cases), you may receive less marks than is suggested but your marks will otherwise be determined by test cases. + +| Marks | Task | +| ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 4 | Compute and output equations for bisectors given pairs of points in a file. | +| 2 | Compute and output intersection points for bisectors against a given polygon. | +| 6 | Implement the incremental voronoi algorithm and output the diameter of each voronoi cell with its associated information in the original output order. | +| 2 | Sort the watchtowers by the diameter of those cells. | +| 1 | Program style consistent with Programming Style slide. Memory allocations and file opens checked. | + +Note that code style will be manually marked in order to provide you +with the most meaningful feedback for the second assignment. diff --git a/docs/images/image01.png b/docs/images/image01.png new file mode 100644 index 0000000..bfe0433 Binary files /dev/null and b/docs/images/image01.png differ diff --git a/docs/images/image02.png b/docs/images/image02.png new file mode 100644 index 0000000..5ba4aff Binary files /dev/null and b/docs/images/image02.png differ diff --git a/docs/images/image03.png b/docs/images/image03.png new file mode 100644 index 0000000..3584ad6 Binary files /dev/null and b/docs/images/image03.png differ diff --git a/docs/images/image04.png b/docs/images/image04.png new file mode 100644 index 0000000..b10ac7a Binary files /dev/null and b/docs/images/image04.png differ diff --git a/docs/images/image05.png b/docs/images/image05.png new file mode 100644 index 0000000..86c502e Binary files /dev/null and b/docs/images/image05.png differ diff --git a/docs/images/image06.png b/docs/images/image06.png new file mode 100644 index 0000000..a150430 Binary files /dev/null and b/docs/images/image06.png differ diff --git a/docs/images/image07.png b/docs/images/image07.png new file mode 100644 index 0000000..638fbf8 Binary files /dev/null and b/docs/images/image07.png differ diff --git a/docs/images/image08.png b/docs/images/image08.png new file mode 100644 index 0000000..325d30f Binary files /dev/null and b/docs/images/image08.png differ diff --git a/docs/images/image09.png b/docs/images/image09.png new file mode 100644 index 0000000..3b72d23 Binary files /dev/null and b/docs/images/image09.png differ diff --git a/docs/intersection.c b/docs/intersection.c new file mode 100644 index 0000000..bd4b2d4 --- /dev/null +++ b/docs/intersection.c @@ -0,0 +1,218 @@ +enum intersectType; + +enum intersectType { + DOESNT_INTERSECT = 0, // Doesn't intersect + INTERSECT = 1, // Intersects + SAME_LINE_OVERLAP = 2, // Lines are the same + ENDS_OVERLAP = 3 // Intersects at exactly one point (endpoint) +}; + +/* +This intersection is based on code by Joseph O'Rourke and is provided for use in +COMP20003 Assignment 2. + +The approach for intersections is: +- Use the bisector to construct a finite segment and test it against the half-edge. +- Use O'Rourke's segseg intersection (https://hydra.smith.edu/~jorourke/books/ftp.html) + to check if the values overlap. +*/ +/* + Generates a segment with each end at least minLength away in each direction + from the bisector midpoint. Returns 1 if b intersects the given half-edge + on this segment, 0 otherwise. Sets the intersection point to the given x, y + positions. +*/ + +/* Returns -1, 0 or 1, based on the area enclosed by the three points. 0 corresponds + to no area enclosed. +*/ +int areaSign(double sx, double sy, double ex, double ey, double x, double y); + +/* Returns 1 if the point (x, y) is in the line from s(x, y) to e(x, y), 0 otherwise. */ +int collinear(double sx, double sy, double ex, double ey, double x, double y); + +int collinear(double sx, double sy, double ex, double ey, double x, double y){ + /* Work out area of parallelogram - if it's 0, points are in the same line. */ + if (areaSign(sx, sy, ex, ey, x, y) == 0){ + return 1; + } else { + return 0; + } +} + +int areaSign(double sx, double sy, double ex, double ey, double x, double y){ + double areaSq; + /* |AB x AC|^2, squared area */ + /* See https://mathworld.wolfram.com/CrossProduct.html */ + areaSq = (ex - sx) * (y - sy) - + (x - sx) * (ey - sy); + + if(areaSq > 0.0){ + return 1; + } else if(areaSq == 0.0){ + return 0; + } else { + return -1; + } +} + +/* Returns 1 if point (x, y) is between (sx, sy) and (se, se) */ +int between(double sx, double sy, double ex, double ey, double x, double y); + +int between(double sx, double sy, double ex, double ey, double x, double y){ + if(sx != ex){ + /* If not vertical, check whether between x. */ + if((sx <= x && x <= ex) || (sx >= x && x >= ex)){ + return 1; + } else { + return 0; + } + } else { + /* Vertical, so can't check _between_ x-values. Check y-axis. */ + if((sy <= y && y <= ey) || (sy >= y && y >= ey)){ + return 1; + } else { + return 0; + } + } +} + +enum intersectType parallelIntersects(double heSx, double heSy, double heEx, double heEy, + double bSx, double bSy, double bEx, double bEy, double *x, double *y); + +enum intersectType parallelIntersects(double heSx, double heSy, double heEx, double heEy, + double bSx, double bSy, double bEx, double bEy, double *x, double *y){ + if(!collinear(heSx, heSy, heEx, heEy, bSx, bSy)){ + /* Parallel, no intersection so don't set (x, y) */ + return DOESNT_INTERSECT; + } + /* bS between heS and heE */ + if(between(heSx, heSy, heEx, heEy, bSx, bSy)){ + *x = bSx; + *y = bSy; + return SAME_LINE_OVERLAP; + } + /* bE between heS and heE */ + if(between(heSx, heSy, heEx, heEy, bEx, bEy)){ + *x = bEx; + *y = bEy; + return SAME_LINE_OVERLAP; + } + /* heS between bS and bE */ + if(between(bSx, bSy, bEx, bEy, heSx, heSy)){ + *x = heSx; + *y = heSy; + return SAME_LINE_OVERLAP; + } + /* heE between bS and bE */ + if(between(bSx, bSy, bEx, bEy, heEx, heEy)){ + *x = heEx; + *y = heEy; + return SAME_LINE_OVERLAP; + } + + return DOESNT_INTERSECT; +} + +enum intersectType intersects( ... , double *x, double *y); + +enum intersectType intersects( ... , double *x, double *y){ + /* Half-edge x, y pair */ + double heSx = ...; + double heSy = ...; + double heEx = ...; + double heEy = ...; + + /* Bisector x, y pair */ + double bSx = ...; + double bSy = ...; + double bEx = ...; + double bEy = ...; + + /* Parametric equation parameters */ + double t1; + double t2; + /* Numerators for X and Y coordinate of intersection. */ + double numeratorX; + double numeratorY; + /* Denominators of intersection coordinates. */ + double denominator; + + /* + See http://www.cs.jhu.edu/~misha/Spring20/15.pdf + for explanation and intuition of the algorithm here. + x_1 = heSx, y_1 = heSy | p_1 = heS + x_2 = heEx, y_2 = heEy | q_1 = heE + x_3 = bSx , y_3 = bSy | p_2 = bS + x_4 = bEx , y_4 = bEy | q_2 = bE + ---------------------------------------- + So the parameters t1 and t2 are given by: + | t1 | | heEx - heSx bSx - bEx | -1 | bSx - heSx | + | | = | | | | + | t2 | | heEy - heSy bSy - bEy | | bSy - heSy | + + Hence: + | t1 | 1 | bSy - bEy bEx - bSx | | bSx - heSx | + | | = --------- | | | | + | t2 | ad - bc | heSy - heEy heEx - heSx | | bSy - heSy | + + where + a = heEx - heSx + b = bSx - bEx + c = heEy - heSy + d = bSy - bEy + */ + + /* Here we calculate ad - bc */ + denominator = heSx * (bEy - bSy) + + heEx * (bSy - bEy) + + bEx * (heEy - heSy) + + bSx * (heSy - heEy); + + if(denominator == 0){ + /* In this case the two are parallel */ + return parallelIntersects(heSx, heSy, heEx, heEy, bSx, bSy, bEx, bEy, x, y); + } + + /* + Here we calculate the top row. + | bSy - bEy bEx - bSx | | bSx - heSx | + | | | | + | | | bSy - heSy | + */ + numeratorX = heSx * (bEy - bSy) + + bSx * (heSy - bEy) + + bEx * (bSy - heSy); + + /* + Here we calculate the bottom row. + | | | bSx - heSx | + | | | | + | heSy - heEy heEx - heSx | | bSy - heSy | + */ + numeratorY = -(heSx * (bSy - heEy) + + heEx * (heSy - bSy) + + bSx * (heEy - heSy)); + + /* Use parameters to convert to the intersection point */ + t1 = numeratorX/denominator; + t2 = numeratorY/denominator; + *x = heSx + t1 * (heEx - heSx); + *y = heSy + t1 * (heEy - heSy); + + /* Make final decision - if point is on segments, parameter values will be + between 0, the start of the line segment, and 1, the end of the line segment. + */ + if (0.0 < t1 && t1 < 1.0 && 0.0 < t2 && t2 < 1.0){ + return INTERSECT; + } else if(t1 < 0.0 || 1.0 < t1 || t2 < 0.0 || 1.0 < t2){ + /* s or t outside of line segment. */ + return DOESNT_INTERSECT; + } else { + /* + ((numeratorX == 0) || (numeratorY == 0) || + (numeratorX == denominator) || (numeratorY == denominator)) + */ + return ENDS_OVERLAP; + } +} diff --git a/docs/programming-style.c b/docs/programming-style.c new file mode 100644 index 0000000..188e41f --- /dev/null +++ b/docs/programming-style.c @@ -0,0 +1,298 @@ +/** *********************** +* C Programming Style for Engineering Computation +* Created by Aidan Nagorcka-Smith (aidann@student.unimelb.edu.au) 13/03/2011 +* Definitions and includes +* Definitions are in UPPER_CASE +* Includes go before definitions +* Space between includes, definitions and the main function. +* Use definitions for any constants in your program, do not just write them +* in. +* +* Tabs may be set to 4-spaces or 8-spaces, depending on your editor. The code +* Below is ``gnu'' style. If your editor has ``bsd'' it will follow the 8-space +* style. Both are very standard. +*/ + +/** +* GOOD: +*/ + +#include +#include +#define MAX_STRING_SIZE 1000 +#define DEBUG 0 +int main(int argc, char **argv) { + ... + +/** +* BAD: +*/ + +/* Definitions and includes are mixed up */ +#include +#define MAX_STING_SIZE 1000 +/* Definitions are given names like variables */ +#define debug 0 +#include +/* No spacing between includes, definitions and main function*/ +int main(int argc, char **argv) { + ... + +/** ***************************** +* Variables +* Give them useful lower_case names or camelCase. Either is fine, +* as long as you are consistent and apply always the same style. +* Initialise them to something that makes sense. +*/ + +/** +* GOOD: lower_case +*/ + +int main(int argc, char **argv) { + + int i = 0; + int num_fifties = 0; + int num_twenties = 0; + int num_tens = 0; + + ... +/** +* GOOD: camelCase +*/ + +int main(int argc, char **argv) { + + int i = 0; + int numFifties = 0; + int numTwenties = 0; + int numTens = 0; + + ... +/** +* BAD: +*/ + +int main(int argc, char **argv) { + + /* Variable not initialised - causes a bug because we didn't remember to + * set it before the loop */ + int i; + /* Variable in all caps - we'll get confused between this and constants + */ + int NUM_FIFTIES = 0; + /* Overly abbreviated variable names make things hard. */ + int nt = 0 + + while (i < 10) { + ... + i++; + } + + ... + +/** ******************** +* Spacing: +* Space intelligently, vertically to group blocks of code that are doing a +* specific operation, or to separate variable declarations from other code. +* One tab of indentation within either a function or a loop. +* Spaces after commas. +* Space between ) and {. +* No space between the ** and the argv in the definition of the main +* function. +* When declaring a pointer variable or argument, you may place the asterisk +* adjacent to either the type or to the variable name. +* Lines at most 80 characters long. +* Closing brace goes on its own line +*/ + +/** +* GOOD: +*/ + +int main(int argc, char **argv) { + + int i = 0; + + for(i = 100; i >= 0; i--) { + if (i > 0) { + printf("%d bottles of beer, take one down and pass it around," + " %d bottles of beer.\n", i, i - 1); + } else { + printf("%d bottles of beer, take one down and pass it around." + " We're empty.\n", i); + } + } + + return 0; +} + +/** +* BAD: +*/ + +/* No space after commas +* Space between the ** and argv in the main function definition +* No space between the ) and { at the start of a function */ +int main(int argc,char ** argv){ + int i = 0; + /* No space between variable declarations and the rest of the function. + * No spaces around the boolean operators */ + for(i=100;i>=0;i--) { + /* No indentation */ + if (i > 0) { + /* Line too long */ + printf("%d bottles of beer, take one down and pass it around, %d +bottles of beer.\n", i, i - 1); + } else { + /* Spacing for no good reason. */ + + printf("%d bottles of beer, take one down and pass it around." + " We're empty.\n", i); + + } + } + /* Closing brace not on its own line */ + return 0;} + +/** **************** +* Braces: +* Opening braces go on the same line as the loop or function name +* Closing braces go on their own line +* Closing braces go at the same indentation level as the thing they are +* closing +*/ + +/** +* GOOD: +*/ + +int main(int argc, char **argv) { + + ... + + for(...) { + ... + } + + return 0; +} + +/** +* BAD: +*/ + +int main(int argc, char **argv) { + + ... + + /* Opening brace on a different line to the for loop open */ + for(...) + { + ... + /* Closing brace at a different indentation to the thing it's + closing + */ + } + + /* Closing brace not on its own line. */ + return 0;} + +/** ************** +* Commenting: +* Each program should have a comment explaining what it does and who created +* it. +* Also comment how to run the program, including optional command line +* parameters. +* Any interesting code should have a comment to explain itself. +* We should not comment obvious things - write code that documents itself +*/ + +/** +* GOOD: +*/ + +/* change.c +* +* Created by Aidan Nagorcka-Smith (aidann@student.unimelb.edu.au) +13/03/2011 +* +* Print the number of each coin that would be needed to make up some +change +* that is input by the user +* +* To run the program type: +* ./coins --num_coins 5 --shape_coins trapezoid --output blabla.txt +* +* To see all the input parameters, type: +* ./coins --help +* Options:: +* --help Show help message +* --num_coins arg Input number of coins +* --shape_coins arg Input coins shape +* --bound arg (=1) Max bound on xxx, default value 1 +* --output arg Output solution file +* +*/ + +int main(int argc, char **argv) { + + int input_change = 0; + + printf("Please input the value of the change (0-99 cents + inclusive):\n"); + scanf("%d", &input_change); + printf("\n"); + + // Valid change values are 0-99 inclusive. + if(input_change < 0 || input_change > 99) { + printf("Input not in the range 0-99.\n") + } + + ... + +/** +* BAD: +*/ + +/* No explanation of what the program is doing */ +int main(int argc, char **argv) { + + /* Commenting obvious things */ + /* Create a int variable called input_change to store the input from + the + * user. */ + int input_change; + + ... + +/** **************** +* Code structure: +* Fail fast - input checks should happen first, then do the computation. +* Structure the code so that all error handling happens in an easy to read +* location +*/ + +/** +* GOOD: +*/ +if (input_is_bad) { + printf("Error: Input was not valid. Exiting.\n"); + exit(EXIT_FAILURE); +} + +/* Do computations here */ +... + +/** +* BAD: +*/ + +if (input_is_good) { + /* lots of computation here, pushing the else part off the screen. + */ + ... +} else { + fprintf(stderr, "Error: Input was not valid. Exiting.\n"); + exit(EXIT_FAILURE); +} diff --git a/docs/videos/voronoi.mp4 b/docs/videos/voronoi.mp4 new file mode 100644 index 0000000..e4655b0 Binary files /dev/null and b/docs/videos/voronoi.mp4 differ diff --git a/input.o b/input.o deleted file mode 100644 index a7d87f1..0000000 Binary files a/input.o and /dev/null differ diff --git a/main.o b/main.o deleted file mode 100644 index 8db26c3..0000000 Binary files a/main.o and /dev/null differ diff --git a/output.txt b/output.txt deleted file mode 100644 index a394812..0000000 --- a/output.txt +++ /dev/null @@ -1 +0,0 @@ -Watchtower ID: WT3765SHSPB, Postcode: 3765, Population Served: 3380, Watchtower Point of Contact Name: Eilene Horner, x: 145.362014, y: -37.818943, Diameter of Cell: 10.000000 diff --git a/common.c b/src/common.c similarity index 95% rename from common.c rename to src/common.c index 3c7b41b..b9fb641 100644 --- a/common.c +++ b/src/common.c @@ -1,29 +1,29 @@ -/* common.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 25th August 2021 - * Last modified 14th September 2021 - * - * Contains functions and headers for general use throughout other files. - * - */ - -#ifndef COMMON_HEADER -#include "common.h" -#endif - -void checkNullPointer(void *ptr) { - if (!ptr) { - fputs("Error: Cannot allocate memory.\n", stderr); - exit(EXIT_FAILURE); - } -} - -FILE *safeFileOpen(FILE **f, char *fileName, char *mode) { - *f = fopen(fileName, mode); - if (*f == NULL) { - fprintf(stderr, "Error: Unable to open file %s\n", fileName); - exit(EXIT_FAILURE); - } - return *f; -} +/* common.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 25th August 2021 + * Last modified 14th September 2021 + * + * Contains functions and headers for general use throughout other files. + * + */ + +#ifndef COMMON_HEADER +#include "common.h" +#endif + +void checkNullPointer(void *ptr) { + if (!ptr) { + fputs("Error: Cannot allocate memory.\n", stderr); + exit(EXIT_FAILURE); + } +} + +FILE *safeFileOpen(FILE **f, char *fileName, char *mode) { + *f = fopen(fileName, mode); + if (*f == NULL) { + fprintf(stderr, "Error: Unable to open file %s\n", fileName); + exit(EXIT_FAILURE); + } + return *f; +} diff --git a/common.h b/src/common.h similarity index 94% rename from common.h rename to src/common.h index 7709843..877ff60 100644 --- a/common.h +++ b/src/common.h @@ -1,31 +1,31 @@ -#ifndef STDIO_HEADER -#define STDIO_HEADER - -#include - -#endif - -#ifndef STDLIB_HEADER -#define STDLIB_HEADER - -#include - -#endif - -#ifndef STRING_HEADER -#define STRING_HEADER - -#include - -#endif - -#ifndef COMMON_HEADER -#define COMMON_HEADER - -/* Checks if a pointer assigned through dynamic memory allocation is NULL */ -void checkNullPointer(void *ptr); - -/* Opens a file and checks if the file is safe to use */ -FILE *safeFileOpen(FILE **f, char *fileName, char *mode); - -#endif +#ifndef STDIO_HEADER +#define STDIO_HEADER + +#include + +#endif + +#ifndef STDLIB_HEADER +#define STDLIB_HEADER + +#include + +#endif + +#ifndef STRING_HEADER +#define STRING_HEADER + +#include + +#endif + +#ifndef COMMON_HEADER +#define COMMON_HEADER + +/* Checks if a pointer assigned through dynamic memory allocation is NULL */ +void checkNullPointer(void *ptr); + +/* Opens a file and checks if the file is safe to use */ +FILE *safeFileOpen(FILE **f, char *fileName, char *mode); + +#endif diff --git a/dcel.c b/src/dcel.c similarity index 97% rename from dcel.c rename to src/dcel.c index 75626f7..4636d97 100644 --- a/dcel.c +++ b/src/dcel.c @@ -1,1219 +1,1219 @@ -/* dcel.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 25th August 2021 - * Last modified 14th September 2021 - * - * Contains functions for the DCEL data structure and related data structures - * (including points, intersections, and bisectors). - * - * Contains several functions and structures from Grady Fitzpatrick's Base - * Code on the Ed Discussion Forum. - * - */ - -#ifndef DCEL_HEADER -#include "dcel.h" -#endif - -#define INITIALVERTICES 4 -#define INITIALEDGES 4 -#define INITIALFACES 1 -#define NOVERTEX (-1) -#define NOEDGE (-1) - -#define DIR_UNDECIDED (0) -#define INSIDE (1) -#define OUTSIDE (-1) -#define NODIAMETER (-1) - -/* ----------------------- My points functions start ----------------------- */ -vertex_t *newPoint() { - vertex_t *newPoint = malloc(sizeof(*newPoint)); - checkNullPointer(newPoint); - return newPoint; -} - -vertex_t *getAPoint(double x, double y) { - vertex_t *point = newPoint(); - point->x = x; - point->y = y; - return point; -} - -vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints) { - /* Initial size of buffer is 1 as getline() reallocs as needed */ - size_t lineBufferSize = 1; - - /* Stores the current line from the points file */ - char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); - checkNullPointer(lineBuffer); - - /* Assuming that pointsFile is valid, there must be at least two points */ - int maxSizePoints = 2; - - while (getline(&lineBuffer, &lineBufferSize, pointsFile) > 0) { - /* Ensure there is enough space in the points array */ - if (*numPoints == maxSizePoints) { - maxSizePoints *= 2; - vertex_t **temp = realloc(points, maxSizePoints * sizeof(*points)); - checkNullPointer(temp); - points = temp; - } - - double xCoordinateA, yCoordinateA, xCoordinateB, yCoordinateB; - sscanf(lineBuffer, "%lf %lf %lf %lf", &xCoordinateA, &yCoordinateA, \ - &xCoordinateB, &yCoordinateB); - - points[*numPoints] = malloc(sizeof(*points[*numPoints])); - points[*numPoints]->x = xCoordinateA; - points[*numPoints]->y = yCoordinateA; - *numPoints += 1; - - points[*numPoints] = malloc(sizeof(*points[*numPoints])); - points[*numPoints]->x = xCoordinateB; - points[*numPoints]->y = yCoordinateB; - *numPoints += 1; - } - - free(lineBuffer); - return points; -} - -void freePoints(vertex_t **points, int numPoints) { - if (!points) { - return; - } - - for (int i = 0; i < numPoints; i++) { - if (points[i]) { - free(points[i]); - } - } - free(points); -} - -double distPoints(vertex_t *pointA, vertex_t *pointB) { - double a = pointB->x - pointA->x; - double b = pointB->y - pointA->y; - return sqrt(a * a + b * b); -} - -/* ------------------------ My points functions end ------------------------ */ - -/* -------------------- My intersection functions start -------------------- */ - -intersection_t *newIntersection() { - intersection_t *intersection = malloc(sizeof(*intersection)); - checkNullPointer(intersection); - - intersection->fromPoint = malloc(sizeof(*intersection->fromPoint)); - checkNullPointer(intersection->fromPoint); - - intersection->toPoint = malloc(sizeof(*intersection->toPoint)); - checkNullPointer(intersection->toPoint); - - return intersection; -} - -intersection_t *getAnIntersection(intersection_t *intersection, DCEL_t *dcel, \ - bisector_t *bisector, int face, int minLength) { - - /* Intersection coordinates */ - double x, y; - - /* Flag is raised when first intersection is found */ - int isIntersectionFound = 0; - - halfEdge_t *startHE = (dcel->faces)[face].start; - halfEdge_t *currentHE = startHE; - int startVertex = startHE->startVertex; - int first = 1; - - /* Loop through the face until the starting vertex is reached */ - while (first || currentHE->startVertex != startVertex) { - enum intersectType typeOfIntersection = \ - intersects(currentHE, bisector, dcel, minLength, &x, &y); - - switch (typeOfIntersection) { - case INTERSECT: - case SAME_LINE_OVERLAP: - case ENDS_OVERLAP: - if (!isIntersectionFound) { - /* First point of intersection */ - isIntersectionFound = 1; - intersection = newIntersection(); - intersection->fromPoint->x = x; - intersection->fromPoint->y = y; - intersection->fromEdge = currentHE->edge; - } else { - /* Second point of intersection */ - intersection->toPoint->x = x; - intersection->toPoint->y = y; - intersection->toEdge = currentHE->edge; - } - break; - case DOESNT_INTERSECT: - default: - break; - } - currentHE = currentHE->next; - first = 0; - } - - return intersection; -} - -intersection_t **getIntersections(intersection_t **intersections, \ - int *numIntersections, bisector_t **bisectors, int numBisectors, \ - DCEL_t *dcel, int face, double minLength) { - - int maxSizeIntersections = 1; - - for (int i = 0; i < numBisectors; i++) { - intersection_t *intersection = NULL; - intersection = getAnIntersection(intersection, dcel, bisectors[i], \ - face, minLength); - - /* If there is an intersection, add it to the array */ - if (intersection != NULL) { - /* Ensure there is enough space in the array */ - if (*numIntersections == maxSizeIntersections) { - maxSizeIntersections *= 2; - intersection_t **temp = realloc(intersections, \ - maxSizeIntersections * sizeof(*intersections)); - checkNullPointer(temp); - intersections = temp; - } - - intersections[*numIntersections] = intersection; - *numIntersections += 1; - } - } - - return intersections; -} - -void freeIntersections(intersection_t **intersections, int numIntersections) { - if (!intersections) { - return; - } - - for (int i = 0; i < numIntersections; i++) { - if (intersections[i]->fromPoint) { - free(intersections[i]->fromPoint); - } - if (intersections[i]->toPoint) { - free(intersections[i]->toPoint); - } - if (intersections[i]) { - free(intersections[i]); - } - } - free(intersections); -} - -/* --------------------- My intersection functions end --------------------- */ - -/* ---------------------- My bisector functions start ---------------------- */ - -bisector_t *newBisector() { - bisector_t *newBisector = malloc(sizeof(*newBisector)); - checkNullPointer(newBisector); - newBisector->mid = malloc(sizeof(*newBisector->mid)); - checkNullPointer(newBisector->mid); - return newBisector; -} - -bisector_t *getABisector(bisector_t *bisector, vertex_t *pointA, \ - vertex_t *pointB) { - - /* Calculate midpoint of the two points */ - bisector->mid->x = (pointA->x + pointB->x) / 2; - bisector->mid->y = (pointA->y + pointB->y) / 2; - - /* Calculating bisector slope according to slope of AB */ - if (pointA->x == pointB->x) { - /* The line segment AB has an infinite gradient, - * so the orthogonal line will have zero slope. - */ - bisector->slope = 0; - bisector->isSlopeInfinite = 0; - } else if (pointA->y == pointB->y) { - /* The line segment AB has gradient of zero, so - * the orthogonal line will have an infinite slope. - */ - bisector->isSlopeInfinite = 1; - - /* Not actually zero, just a placeholder to prevent - * accidental errors - */ - bisector->slope = 0; - } else { - /* The line segment AB has a non-zero and finite gradient, - * so the gradient of the bisector can be calculated. - */ - bisector->isSlopeInfinite = 0; - bisector->slope = -1 / ((pointB->y - pointA->y) / \ - (pointB->x - pointA->x)); - } - - return bisector; -} - -bisector_t **getBisectors(bisector_t **bisectors, vertex_t **points, \ - int numBisectors) { - - for (int i = 0; i < numBisectors; i++) { - bisectors[i] = newBisector(); - bisectors[i] = getABisector(bisectors[i], points[2 * i], \ - points[2 * i + 1]); - } - - return bisectors; -} - -vertex_t *getBisectorPoint(double distance, bisector_t *b, int direction) { - vertex_t *returnPoint = malloc(sizeof(*returnPoint)); - - if (b->isSlopeInfinite) { - /* Vertical line - just add vertical distance */ - returnPoint->x = b->mid->x; - returnPoint->y = b->mid->y + (distance * direction); - } else if (b->slope == 0) { - /* Horizontal line - just add horizontal distance */ - returnPoint->x = b->mid->x + (distance * direction); - returnPoint->y = b->mid->y; - } else { - /* Not horizontal or vertical - add distance to x, then find - * y-intercept of the bisector, and plug it in to y = mx + c to find - * the corresponding y-value. - */ - double c = b->mid->y - b->slope * b->mid->x; - returnPoint->x = b->mid->x + (distance * direction); - returnPoint->y = b->slope * returnPoint->x + c; - } - - return returnPoint; -} - -void freeBisectors(bisector_t **bisectors, int numBisectors) { - if (!bisectors) { - return; - } - - for (int i = 0; i < numBisectors; i++) { - if (bisectors[i]->mid) { - free(bisectors[i]->mid); - } - if (bisectors[i]) { - free(bisectors[i]); - } - } - free(bisectors); -} - -/* ----------------------- My bisector functions end ----------------------- */ - -/* ------------------------ My DCEL functions start ------------------------ */ - -double getDiameter(DCEL_t *dcel, int faceIndex) { - /* firstHE and firstVertex refer to the first HE/vertex from the face used - * to control when the loop stops - * - * startHE and startVertex refer to the starting point used to - * advance the new starting vertex after a complete cycle - * - * currentHE and currentVertex refer to the current HE/vertex being used to - * compute the diameter - */ - halfEdge_t *firstHE = (dcel->faces)[faceIndex].start; - halfEdge_t *startHE = firstHE; - halfEdge_t *currentHE = startHE; - int firstVertex = firstHE->startVertex; - int startVertex = firstVertex; - int currentVertex = startVertex; - int first = 1; - double currentDiameter = NODIAMETER, maxDiameter = NODIAMETER; - - while (first || !(currentHE->startVertex == firstVertex && \ - startHE->startVertex == firstVertex)) { - first = 0; - - /* Compute currentDiameter, compare to maxDiameter */ - currentDiameter = distPoints(&(dcel->vertices)[startVertex], \ - &(dcel->vertices)[currentVertex]); - if (currentDiameter >= maxDiameter) { - maxDiameter = currentDiameter; - } - - /* Advance current HE, update currentVertex */ - currentHE = currentHE->next; - currentVertex = currentHE->startVertex; - - /* When the starting vertex is reached, move the startHE to the next HE - * and update the vertices. - */ - if (currentVertex == startVertex) { - startHE = startHE->next; - currentHE = startHE; - startVertex = startHE->startVertex; - currentVertex = startVertex; - } - } - - if (currentDiameter == NODIAMETER) { - return NODIAMETER; - } - - return maxDiameter; -} - -/* ------------------------- My DCEL functions end ------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* */ -/* Here onwards are the functions from Grady's base code on Ed */ -/* */ -/* ------------------------------------------------------------------------- */ - -DCEL_t *newDCEL() { - /* Setup DCEL. */ - DCEL_t *dcel = malloc(sizeof(*dcel)); - checkNullPointer(dcel); - - dcel->edges = NULL; - dcel->edgesUsed = 0; - dcel->edgesAllocated = 0; - - dcel->faces = NULL; - dcel->facesUsed = 0; - dcel->facesAllocated = 0; - - dcel->vertices = NULL; - dcel->verticesUsed = 0; - dcel->verticesAllocated = 0; - - return dcel; -} - -halfEdge_t *newHalfEdge() { - halfEdge_t *he = malloc(sizeof(*he)); - checkNullPointer(he); - he->startVertex = NOVERTEX; - he->endVertex = NOVERTEX; - he->next = NULL; - he->previous = NULL; - he->twin = NULL; - he->face = NOFACE; - he->edge = NOEDGE; - return he; -} - -void ensureSpaceForVertex(DCEL_t *dcel) { - if (!(dcel->vertices)) { - dcel->vertices = malloc(sizeof(*dcel->vertices) * INITIALVERTICES); - checkNullPointer(dcel->vertices); - dcel->verticesAllocated = INITIALVERTICES; - } else if ((dcel->verticesUsed + 1) > dcel->verticesAllocated) { - dcel->vertices = realloc(dcel->vertices, \ - sizeof(*dcel->vertices) * dcel->verticesAllocated * 2); - checkNullPointer(dcel->vertices); - dcel->verticesAllocated = dcel->verticesAllocated * 2; - } -} - -void ensureSpaceForEdge(DCEL_t *dcel) { - if (!(dcel->edges)) { - dcel->edges = malloc(sizeof(*dcel->edges) * INITIALEDGES); - checkNullPointer(dcel->edges); - dcel->edgesAllocated = INITIALEDGES; - } else if ((dcel->edgesUsed + 1) > dcel->edgesAllocated) { - dcel->edges = realloc(dcel->edges, \ - sizeof(*dcel->edges) * dcel->edgesAllocated * 2); - checkNullPointer(dcel->edges); - dcel->edgesAllocated = dcel->edgesAllocated * 2; - } -} - -void ensureSpaceForFace(DCEL_t *dcel) { - if (!(dcel->faces)) { - dcel->faces = malloc(sizeof(*dcel->faces) * INITIALFACES); - checkNullPointer(dcel->faces); - dcel->facesAllocated = INITIALFACES; - } else if ((dcel->facesUsed + 1) > dcel->facesAllocated) { - dcel->faces = realloc(dcel->faces, \ - sizeof(*dcel->faces) * dcel->facesAllocated * 2); - checkNullPointer(dcel->faces); - dcel->facesAllocated = dcel->facesAllocated * 2; - } -} - -void addEdge(DCEL_t *dcel, int startVertex, int endVertex) { - ensureSpaceForEdge(dcel); - - int newEdge = dcel->edgesUsed; - - halfEdge_t *newHE = newHalfEdge(); - newHE->startVertex = startVertex; - newHE->endVertex = endVertex; - // newHE->next = NULL; - // newHE->previous = NULL; - // newHE->twin = NULL; - // newHE->face = NOFACE; - newHE->edge = newEdge; - - (dcel->edges)[newEdge].halfEdge = newHE; - - dcel->edgesUsed = dcel->edgesUsed + 1; -} - -void addFace(DCEL_t *dcel, halfEdge_t *he) { - ensureSpaceForFace(dcel); - (dcel->faces)[dcel->facesUsed].start = he; - /* Set the face in the half-edges. */ - he->face = dcel->facesUsed; - - (dcel->faces)[dcel->facesUsed].tower = NULL; - - halfEdge_t *current = he->next; - while(current != he) { - current->face = dcel->facesUsed; - current = current->next; - } - - dcel->facesUsed = dcel->facesUsed + 1; -} - -DCEL_t *readPolygonFile(char *polygonfileName) { - DCEL_t *dcel = newDCEL(); - - FILE *polygonFile = fopen(polygonfileName, "r"); - checkNullPointer(polygonFile); - double x; - double y; - - int startVertex = NOVERTEX; - int endVertex = NOVERTEX; - - /* Used to finish off the polygon in the first face. */ - int firstVertex = NOVERTEX; - int firstEdge = NOEDGE; - - while(fscanf(polygonFile, "%lf %lf", &x, &y) == 2) { - ensureSpaceForVertex(dcel); - - (dcel->vertices)[dcel->verticesUsed].x = x; - (dcel->vertices)[dcel->verticesUsed].y = y; - dcel->verticesUsed = dcel->verticesUsed + 1; - - if (startVertex == NOVERTEX) { - startVertex = dcel->verticesUsed - 1; - firstVertex = startVertex; - } else if (endVertex == NOVERTEX) { - /* First edge */ - endVertex = dcel->verticesUsed - 1; - firstEdge = dcel->edgesUsed; - addEdge(dcel, startVertex, endVertex); - } else { - /* Start from last vertex. */ - startVertex = endVertex; - endVertex = dcel->verticesUsed - 1; - addEdge(dcel, startVertex, endVertex); - - /* Connect last edge added to newest edge */ - ((dcel->edges)[dcel->edgesUsed - 2].halfEdge)->next = \ - (dcel->edges)[dcel->edgesUsed - 1].halfEdge; - - /* Connect newest edge to last edge added */ - ((dcel->edges)[dcel->edgesUsed - 1].halfEdge)->previous = \ - (dcel->edges)[dcel->edgesUsed - 2].halfEdge; - } - } - - if (firstEdge == NOEDGE) { - fputs("Error: Unable to create DCEL structure for polygon.\n", stderr); - exit(EXIT_FAILURE); - } - - /* Finalise polygon by adding edge back to first vertex. */ - int finalEdge = dcel->edgesUsed; - addEdge(dcel, endVertex, firstVertex); - - /* Connect previous edge to this edge. */ - ((dcel->edges)[dcel->edgesUsed - 2].halfEdge)->next = \ - (dcel->edges)[dcel->edgesUsed - 1].halfEdge; - - /* Connect newest edge to last edge added */ - ((dcel->edges)[dcel->edgesUsed - 1].halfEdge)->previous = \ - (dcel->edges)[dcel->edgesUsed - 2].halfEdge; - - /* Connect final edge back to start edge. */ - ((dcel->edges)[finalEdge].halfEdge)->next = \ - (dcel->edges)[firstEdge].halfEdge; - - /* Connect start edge back to final edge. */ - ((dcel->edges)[firstEdge].halfEdge)->previous = \ - (dcel->edges)[finalEdge].halfEdge; - - /* Add face to DCEL - could be any edge we constructed, - * so may as well be the first. - */ - addFace(dcel, (dcel->edges)[firstEdge].halfEdge); - if (polygonFile) { - fclose(polygonFile); - } - - return dcel; -} - -split_t *readNextSplit(FILE *splitfile) { - int firstEdge; - int secondEdge; - if (fscanf(splitfile, "%d %d", &firstEdge, &secondEdge) != 2) { - return NULL; - } - split_t *split = malloc(sizeof(*split)); - split->startEdge = firstEdge; - split->endEdge = secondEdge; - split->verticesSpecified = 0; - return split; -} - -void freeSplit(split_t *split) { - if (split) { - free(split); - } -} - -int vertexMatch(vertex_t *v1, vertex_t *v2) { - if (v1->x != v2->x) { - return 0; - } - if (v1->y != v2->y) { - return 0; - } - return 1; -} - -void applySplit(split_t *split, DCEL_t *dcel) { - int isAdjacent; - double midpointX; - double midpointY; - halfEdge_t *startHE; - halfEdge_t *endHE; - halfEdge_t *newJoinHE; - halfEdge_t *newJoinHEPair; - halfEdge_t *newStartHEToMid; - halfEdge_t *newStartHEToMidPair; - halfEdge_t *newMidHEToEnd; - halfEdge_t *newMidHEToEndPair; - /* Temporary holders for old twin edges */ - halfEdge_t *oldStartPairPrev; - halfEdge_t *oldEndPairNext; - /* Temporary holder for old pairs */ - halfEdge_t *oldStartPair; - halfEdge_t *oldEndPair; - - int newVertexMidStart; - int newVertexMidEnd; - /* The vertex representing the end of the original starting edge */ - int oldVertexStart; - /* The vertex representing the start of the original ending edge */ - int oldVertexEnd; - - /* Each split creates exactly 3 edges, so we can set up space for these now. */ - int joinEdge; - int newStartEdge; - int newEndEdge; - - ensureSpaceForEdge(dcel); - joinEdge = dcel->edgesUsed; - dcel->edgesUsed = dcel->edgesUsed + 1; - - ensureSpaceForEdge(dcel); - newStartEdge = dcel->edgesUsed; - dcel->edgesUsed = dcel->edgesUsed + 1; - - ensureSpaceForEdge(dcel); - newEndEdge = dcel->edgesUsed; - dcel->edgesUsed = dcel->edgesUsed + 1; - - /* Get vertices for MidStart and MidEnd */ - ensureSpaceForVertex(dcel); - newVertexMidStart = dcel->verticesUsed; - dcel->verticesUsed = dcel->verticesUsed + 1; - - ensureSpaceForVertex(dcel); - newVertexMidEnd = dcel->verticesUsed; - dcel->verticesUsed = dcel->verticesUsed + 1; - - /* Work out what half-edges we need to use. */ - startHE = (dcel->edges)[split->startEdge].halfEdge; - endHE = (dcel->edges)[split->endEdge].halfEdge; - - /* Set midpoint of start */ - double startX = (dcel->vertices)[startHE->startVertex].x; - double startY = (dcel->vertices)[startHE->startVertex].y; - double endX = (dcel->vertices)[startHE->endVertex].x; - double endY = (dcel->vertices)[startHE->endVertex].y; - if (split->verticesSpecified) { - /* See if vertex needs to be reused */ - if (vertexMatch(&(dcel->vertices)[startHE->endVertex], - &split->startPoint)) { - newVertexMidStart = startHE->endVertex; - } else if (vertexMatch(&(dcel->vertices)[startHE->startVertex], - &split->startPoint)) { - newVertexMidStart = startHE->startVertex; - } else { - (dcel->vertices)[newVertexMidStart].x = split->startPoint.x; - (dcel->vertices)[newVertexMidStart].y = split->startPoint.y; - } - } else { - (dcel->vertices)[newVertexMidStart].x = (startX + endX) / 2.0; - (dcel->vertices)[newVertexMidStart].y = (startY + endY) / 2.0; - } - - - /* Set midpoint of end */ - startX = (dcel->vertices)[endHE->startVertex].x; - startY = (dcel->vertices)[endHE->startVertex].y; - endX = (dcel->vertices)[endHE->endVertex].x; - endY = (dcel->vertices)[endHE->endVertex].y; - if (split->verticesSpecified) { - /* See if vertex needs to be reused */ - if (vertexMatch(&(dcel->vertices)[endHE->startVertex], - &split->endPoint)) { - newVertexMidEnd = endHE->startVertex; - } else if (vertexMatch(&(dcel->vertices)[endHE->endVertex], - &split->endPoint)) { - newVertexMidEnd = endHE->endVertex; - } else { - (dcel->vertices)[newVertexMidEnd].x = split->endPoint.x; - (dcel->vertices)[newVertexMidEnd].y = split->endPoint.y; - } - } else { - (dcel->vertices)[newVertexMidEnd].x = (startX + endX) / 2.0; - (dcel->vertices)[newVertexMidEnd].y = (startY + endY) / 2.0; - } - - - /* Get point halfway between both midpoints */ - double x1 = (dcel->vertices)[newVertexMidStart].x; - double x2 = (dcel->vertices)[newVertexMidEnd].x; - double y1 = (dcel->vertices)[newVertexMidStart].y; - double y2 = (dcel->vertices)[newVertexMidEnd].y; - midpointX = (x1 + x2) / 2.0; - midpointY = (y1 + y2) / 2.0; - - /* Work out whether on correct side. */ - vertex_t *v1 = &((dcel->vertices)[startHE->startVertex]); - vertex_t *v2 = &((dcel->vertices)[startHE->endVertex]); - if (getRelativeDir(midpointX, midpointY, v1, v2) == OUTSIDE) { - startHE = startHE->twin; - } - v1 = &((dcel->vertices)[endHE->startVertex]); - v2 = &((dcel->vertices)[endHE->endVertex]); - if (getRelativeDir(midpointX, midpointY, v1, v2) == OUTSIDE) { - endHE = endHE->twin; - } - - /* Work out whether edges are adjacent. */ - if (startHE->next == endHE) { - isAdjacent = 1; - } else { - isAdjacent = 0; - } - - /* Store old previous and next from start and end edges for convenience */ - halfEdge_t *oldEndPrev = endHE->previous; - halfEdge_t *oldStartNext = startHE->next; - oldVertexEnd = endHE->startVertex; - oldVertexStart = startHE->endVertex; - - /* Update vertices of endHE and startHE */ - endHE->startVertex = newVertexMidEnd; - startHE->endVertex = newVertexMidStart; - - /* Add bridging edges */ - newJoinHE = newHalfEdge(); - - newJoinHE->startVertex = newVertexMidStart; - newJoinHE->endVertex = newVertexMidEnd; - newJoinHE->next = endHE; - endHE->previous = newJoinHE; - newJoinHE->previous = startHE; - startHE->next = newJoinHE; - newJoinHE->twin = NULL; // Will be set later - /* joinHE is same face as startHE and endHE */ - newJoinHE->face = startHE->face; - newJoinHE->edge = joinEdge; - - /* Set joinEdge to relevant halfEdge */ - (dcel->edges)[joinEdge].halfEdge = newJoinHE; - - newJoinHEPair = newHalfEdge(); - /* twin is in opposite direction. */ - newJoinHEPair->startVertex = newVertexMidEnd; - newJoinHEPair->endVertex = newVertexMidStart; - newJoinHEPair->next = NULL; // Will join to new HEs - newJoinHEPair->previous = NULL; // Will join to new HEs - newJoinHEPair->twin = newJoinHE; - newJoinHE->twin = newJoinHEPair; - newJoinHEPair->face = NOFACE; // Will be new face set later - newJoinHEPair->edge = joinEdge; - - /* Set up what we can of new edges */ - newStartHEToMid = newHalfEdge(); - newStartHEToMid->startVertex = newVertexMidStart; - newStartHEToMid->endVertex = oldVertexStart; - newStartHEToMid->next = NULL; // Different setting based on adjacency, set below. - newStartHEToMid->previous = newJoinHEPair; - newJoinHEPair->next = newStartHEToMid; - newStartHEToMid->twin = NULL; // Will be set up later if needed. - newStartHEToMid->face = NOFACE; // Will be new face set later - newStartHEToMid->edge = newStartEdge; - - /* Set newStartEdge to relevant halfEdge */ - (dcel->edges)[newStartEdge].halfEdge = newStartHEToMid; - - newMidHEToEnd = newHalfEdge(); - newMidHEToEnd->startVertex = oldVertexEnd; - newMidHEToEnd->endVertex = newVertexMidEnd; - newMidHEToEnd->next = newJoinHEPair; - newJoinHEPair->previous = newMidHEToEnd; - newMidHEToEnd->previous = NULL; // Different setting based on adjacency, set below. - newMidHEToEnd->twin = NULL; // Will be set up later if needed. - newMidHEToEnd->face = NOFACE; - newMidHEToEnd->edge = newEndEdge; - - /* Set newEndEdge to relevant halfEdge */ - (dcel->edges)[newEndEdge].halfEdge = newMidHEToEnd; - - /* If either start or end HEs have paired Half-Edges, we also need to split those. */ - if (startHE->twin) { - oldStartPairPrev = startHE->twin->previous; - oldStartPair = startHE->twin; - - newStartHEToMidPair = newHalfEdge(); - /* Reverse of twin */ - newStartHEToMidPair->startVertex = oldVertexStart; - newStartHEToMidPair->endVertex = newVertexMidStart; - newStartHEToMidPair->next = oldStartPair; - newStartHEToMidPair->previous = oldStartPairPrev; - startHE->twin->previous = newStartHEToMidPair; - oldStartPair->previous = newStartHEToMidPair; - oldStartPair->startVertex = newVertexMidStart; - oldStartPairPrev->next = newStartHEToMidPair; - newStartHEToMid->twin = newStartHEToMidPair; - newStartHEToMidPair->twin = newStartHEToMid; - newStartHEToMidPair->face = startHE->twin->face; - newStartHEToMidPair->edge = newStartEdge; - } else { - newStartHEToMidPair = NULL; - } - if (endHE->twin) { - oldEndPairNext = endHE->twin->next; - oldEndPair = endHE->twin; - - newMidHEToEndPair = newHalfEdge(); - newMidHEToEndPair->startVertex = newVertexMidEnd; - newMidHEToEndPair->endVertex = oldVertexEnd; - newMidHEToEndPair->next = oldEndPairNext; // endHE->twin ? - oldEndPair->next = newMidHEToEndPair; - oldEndPairNext->previous = newMidHEToEndPair; // Next? - oldEndPair->endVertex = newVertexMidEnd; - newMidHEToEndPair->previous = oldEndPair; - newMidHEToEnd->twin = newMidHEToEndPair; - newMidHEToEndPair->twin = newMidHEToEnd; - newMidHEToEndPair->face = endHE->twin->face; - newMidHEToEndPair->edge = newEndEdge; - } else { - newMidHEToEndPair = NULL; - } - - /* Set up remaining edges. */ - if (isAdjacent) { - newStartHEToMid->next = newMidHEToEnd; - newMidHEToEnd->previous = newStartHEToMid; - } else { - /* Edges are old start and end edges (maybe the same edge). */ - newStartHEToMid->next = oldStartNext; - oldStartNext->previous = newStartHEToMid; - newMidHEToEnd->previous = oldEndPrev; - oldEndPrev->next = newMidHEToEnd; - } - - /* Setup new face. */ - addFace(dcel, newJoinHEPair); - - /* Check if face has overwritten other face */ - int joinFace = startHE->face; - if ((dcel->faces)[joinFace].start->face != joinFace) { - (dcel->faces)[joinFace].start = startHE; - } -} - -void freeDCEL(DCEL_t *dcel) { - if (!dcel) { - return; - } - int i; - if (dcel->edges) { - for(i = 0; i < dcel->edgesUsed; i++) { - if ((dcel->edges)[i].halfEdge) { - if (((dcel->edges)[i]).halfEdge->twin) { - /* Free if edge has two halves. */ - free(((dcel->edges)[i]).halfEdge->twin); - } - free(((dcel->edges)[i]).halfEdge); - } - } - free(dcel->edges); - } - if (dcel->faces) { - /* All edges are freed above, so no need to free each edge here. */ - free(dcel->faces); - } - if (dcel->vertices) { - free(dcel->vertices); - } - free(dcel); -} - -int getFaceCount(DCEL_t *dcel) { - if (!dcel) { - return 0; - } else { - return dcel->facesUsed; - } -} - -int getRelativeDir(double x, double y, vertex_t *v1, vertex_t *v2) { - /* Here we're doing a simple half-plane check against the vector v1->v2. */ - double x1 = v1->x; - double x2 = v2->x; - double y1 = v1->y; - double y2 = v2->y; - if (x1 == x2 && y1 == y2) { - /* Same point. */ - return DIR_UNDECIDED; - } else if (x1 == x2) { - /* y = c line */ - /* Work out whether line is going up or down. */ - if (y2 > y1) { - if (x > x1) { - return INSIDE; - } else if (x < x1) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } else { - if (x < x1) { - return INSIDE; - } else if (x > x1) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } - } else if (y1 == y2) { - /* x = c line */ - /* Work out whether line is going left or right. */ - if (x2 > x1) { - if (y < y1) { - return INSIDE; - } else if (y > y1) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } else { - if (y > y1) { - return INSIDE; - } else if (y < y1) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } - } - - /* - x1, x2, y1, y2 distinct, so see whether point being tested is - above or below gradient line. - */ - double m = (y2 - y1)/(x2 - x1); - double c = y1 - m*x1; - - double predictedY = x * m + c; - double residual = y - predictedY; - - /* - Being inside or outside the polygon depends on the direction - the half-edge is going. - */ - if (x2 > x1) { - if (residual < 0) { - return INSIDE; - } else if (residual > 0) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } else { - if (residual > 0) { - return INSIDE; - } else if (residual < 0) { - return OUTSIDE; - } else { - return DIR_UNDECIDED; - } - } -} - -int directionOrUndecided(int decidedDirection, int direction) { - if (direction == decidedDirection || direction == DIR_UNDECIDED) { - return 1; - } else { - return 0; - } -} - -int inFace(DCEL_t *dcel, double x, double y, int faceIndex) { - if (dcel->facesUsed < faceIndex || !(dcel->faces)[faceIndex].start) { - return OUTSIDE; - } - halfEdge_t *start = (dcel->faces)[faceIndex].start; - int first = 1; - int direction = DIR_UNDECIDED; - - halfEdge_t *current = start; - while(start != current || first) { - if (direction == DIR_UNDECIDED) { - /* Doesn't matter where the point is until we find it on one side or the - other. */ - direction = getRelativeDir(x, y, &(dcel->vertices)[current->startVertex], - &(dcel->vertices)[current->endVertex]); - } else { - if (!directionOrUndecided(direction, - getRelativeDir(x, y, &(dcel->vertices)[current->startVertex], - &(dcel->vertices)[current->endVertex]))) { - /* If the point is on the different side of any edge, it be inside - the face, because the face is convex. */ - return 0; - } - } - current = current->next; - first = 0; - } - - return 1; -} - -/* This intersection is based on code by Joseph O'Rourke and is provided for - * use in COMP20003 Assignment 2. - * - * The approach for intersections is: - * - Use the bisector to construct a finite segment and test it against - * the half-edge. - * - Use O'Rourke's segseg intersection - * (https://hydra.smith.edu/~jorourke/books/ftp.html) to check if the values - * overlap/intersect - * - * Generates a segment with each end at least minLength away in each direction - * from the bisector midpoint. - * - * Returns 1 if b intersects the given half-edge on this segment, 0 otherwise. - * Sets the intersection point to the given x, y positions. - */ - -int areaSign(double sx, double sy, double ex, double ey, double x, double y) { - double areaSq; - /* |AB x AC|^2, squared area */ - /* See https://mathworld.wolfram.com/CrossProduct.html */ - areaSq = (ex - sx) * (y - sy) - - (x - sx) * (ey - sy); - - if (areaSq > 0.0) { - return 1; - } else if (areaSq == 0.0) { - return 0; - } else { - return -1; - } -} - -int between(double sx, double sy, double ex, double ey, double x, double y) { - if (sx != ex) { - /* If not vertical, check whether between x. */ - if ((sx <= x && x <= ex) || (sx >= x && x >= ex)) { - return 1; - } else { - return 0; - } - } else { - /* Vertical, so can't check _between_ x-values. Check y-axis. */ - if ((sy <= y && y <= ey) || (sy >= y && y >= ey)) { - return 1; - } else { - return 0; - } - } -} - -int collinear(double sx, double sy, double ex, double ey, double x, double y) { - /* If area of the parallelogram is 0, then the points - * are in the same line. - */ - if (areaSign(sx, sy, ex, ey, x, y) == 0) { - return 1; - } else { - return 0; - } -} - -enum intersectType parallelIntersects(double heSx, double heSy, \ - double heEx, double heEy, double bSx, double bSy, \ - double bEx, double bEy, double *x, double *y) { - - if (!collinear(heSx, heSy, heEx, heEy, bSx, bSy)) { - /* Parallel, no intersection so don't set (x, y) */ - return DOESNT_INTERSECT; - } - /* bS between heS and heE */ - if (between(heSx, heSy, heEx, heEy, bSx, bSy)) { - *x = bSx; - *y = bSy; - return SAME_LINE_OVERLAP; - } - /* bE between heS and heE */ - if (between(heSx, heSy, heEx, heEy, bEx, bEy)) { - *x = bEx; - *y = bEy; - return SAME_LINE_OVERLAP; - } - /* heS between bS and bE */ - if (between(bSx, bSy, bEx, bEy, heSx, heSy)) { - *x = heSx; - *y = heSy; - return SAME_LINE_OVERLAP; - } - /* heE between bS and bE */ - if (between(bSx, bSy, bEx, bEy, heEx, heEy)) { - *x = heEx; - *y = heEy; - return SAME_LINE_OVERLAP; - } - - return DOESNT_INTERSECT; -} - -enum intersectType intersects(halfEdge_t *he, bisector_t *b, \ - DCEL_t *dcel, double minLength, double *x, double *y) { - - /* Half-edge x, y twin */ - double heSx = dcel->vertices[he->startVertex].x; - double heSy = dcel->vertices[he->startVertex].y; - double heEx = dcel->vertices[he->endVertex].x; - double heEy = dcel->vertices[he->endVertex].y; - - /* Bisector x, y twin */ - vertex_t *startPoint = getBisectorPoint(minLength, b, -1); - vertex_t *endPoint = getBisectorPoint(minLength, b, 1); - double bSx = startPoint->x; - double bSy = startPoint->y; - double bEx = endPoint->x; - double bEy = endPoint->y; - free(startPoint); - free(endPoint); - - /* Parametric equation parameters */ - double t1, t2; - - /* Numerators for X and Y coordinate of intersection. */ - double numeratorX, numeratorY; - - /* Denominators of intersection coordinates. */ - double denominator; - - /* - See http://www.cs.jhu.edu/~misha/Spring20/15.pdf - for explanation and intuition of the algorithm here. - x_1 = heSx, y_1 = heSy | p_1 = heS - x_2 = heEx, y_2 = heEy | q_1 = heE - x_3 = bSx , y_3 = bSy | p_2 = bS - x_4 = bEx , y_4 = bEy | q_2 = bE - ---------------------------------------- - So the parameters t1 and t2 are given by: - | t1 | | heEx - heSx bSx - bEx | -1 | bSx - heSx | - | | = | | | | - | t2 | | heEy - heSy bSy - bEy | | bSy - heSy | - - Hence: - | t1 | 1 | bSy - bEy bEx - bSx | | bSx - heSx | - | | = --------- | | | | - | t2 | ad - bc | heSy - heEy heEx - heSx | | bSy - heSy | - - where - a = heEx - heSx - b = bSx - bEx - c = heEy - heSy - d = bSy - bEy - */ - - /* Here we calculate ad - bc */ - denominator = heSx * (bEy - bSy) + - heEx * (bSy - bEy) + - bEx * (heEy - heSy) + - bSx * (heSy - heEy); - - if (denominator == 0) { - /* In this case the two are parallel */ - return parallelIntersects(heSx, heSy, heEx, heEy, \ - bSx, bSy, bEx, bEy, x, y); - } - - /* - Here we calculate the top row. - | bSy - bEy bEx - bSx | | bSx - heSx | - | | | | - | | | bSy - heSy | - */ - numeratorX = heSx * (bEy - bSy) + - bSx * (heSy - bEy) + - bEx * (bSy - heSy); - - /* - Here we calculate the bottom row. - | | | bSx - heSx | - | | | | - | heSy - heEy heEx - heSx | | bSy - heSy | - */ - numeratorY = -(heSx * (bSy - heEy) + - heEx * (heSy - bSy) + - bSx * (heEy - heSy)); - - /* Use parameters to convert to the intersection point */ - t1 = numeratorX/denominator; - t2 = numeratorY/denominator; - *x = heSx + t1 * (heEx - heSx); - *y = heSy + t1 * (heEy - heSy); - - /* Make final decision - if point is on segments, parameter values will be - between 0, the start of the line segment, and 1, the end of the line segment. - */ - if (0.0 < t1 && t1 < 1.0 && 0.0 < t2 && t2 < 1.0) { - return INTERSECT; - } else if (t1 < 0.0 || 1.0 < t1 || t2 < 0.0 || 1.0 < t2) { - /* s or t outside of line segment. */ - return DOESNT_INTERSECT; - } else { - /* - ((numeratorX == 0) || (numeratorY == 0) || - (numeratorX == denominator) || (numeratorY == denominator)) - */ - return ENDS_OVERLAP; - } -} +/* dcel.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 25th August 2021 + * Last modified 14th September 2021 + * + * Contains functions for the DCEL data structure and related data structures + * (including points, intersections, and bisectors). + * + * Contains several functions and structures from Grady Fitzpatrick's Base + * Code on the Ed Discussion Forum. + * + */ + +#ifndef DCEL_HEADER +#include "dcel.h" +#endif + +#define INITIALVERTICES 4 +#define INITIALEDGES 4 +#define INITIALFACES 1 +#define NOVERTEX (-1) +#define NOEDGE (-1) + +#define DIR_UNDECIDED (0) +#define INSIDE (1) +#define OUTSIDE (-1) +#define NODIAMETER (-1) + +/* ----------------------- My points functions start ----------------------- */ +vertex_t *newPoint() { + vertex_t *newPoint = malloc(sizeof(*newPoint)); + checkNullPointer(newPoint); + return newPoint; +} + +vertex_t *getAPoint(double x, double y) { + vertex_t *point = newPoint(); + point->x = x; + point->y = y; + return point; +} + +vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints) { + /* Initial size of buffer is 1 as getline() reallocs as needed */ + size_t lineBufferSize = 1; + + /* Stores the current line from the points file */ + char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); + checkNullPointer(lineBuffer); + + /* Assuming that pointsFile is valid, there must be at least two points */ + int maxSizePoints = 2; + + while (getline(&lineBuffer, &lineBufferSize, pointsFile) > 0) { + /* Ensure there is enough space in the points array */ + if (*numPoints == maxSizePoints) { + maxSizePoints *= 2; + vertex_t **temp = realloc(points, maxSizePoints * sizeof(*points)); + checkNullPointer(temp); + points = temp; + } + + double xCoordinateA, yCoordinateA, xCoordinateB, yCoordinateB; + sscanf(lineBuffer, "%lf %lf %lf %lf", &xCoordinateA, &yCoordinateA, \ + &xCoordinateB, &yCoordinateB); + + points[*numPoints] = malloc(sizeof(*points[*numPoints])); + points[*numPoints]->x = xCoordinateA; + points[*numPoints]->y = yCoordinateA; + *numPoints += 1; + + points[*numPoints] = malloc(sizeof(*points[*numPoints])); + points[*numPoints]->x = xCoordinateB; + points[*numPoints]->y = yCoordinateB; + *numPoints += 1; + } + + free(lineBuffer); + return points; +} + +void freePoints(vertex_t **points, int numPoints) { + if (!points) { + return; + } + + for (int i = 0; i < numPoints; i++) { + if (points[i]) { + free(points[i]); + } + } + free(points); +} + +double distPoints(vertex_t *pointA, vertex_t *pointB) { + double a = pointB->x - pointA->x; + double b = pointB->y - pointA->y; + return sqrt(a * a + b * b); +} + +/* ------------------------ My points functions end ------------------------ */ + +/* -------------------- My intersection functions start -------------------- */ + +intersection_t *newIntersection() { + intersection_t *intersection = malloc(sizeof(*intersection)); + checkNullPointer(intersection); + + intersection->fromPoint = malloc(sizeof(*intersection->fromPoint)); + checkNullPointer(intersection->fromPoint); + + intersection->toPoint = malloc(sizeof(*intersection->toPoint)); + checkNullPointer(intersection->toPoint); + + return intersection; +} + +intersection_t *getAnIntersection(intersection_t *intersection, DCEL_t *dcel, \ + bisector_t *bisector, int face, int minLength) { + + /* Intersection coordinates */ + double x, y; + + /* Flag is raised when first intersection is found */ + int isIntersectionFound = 0; + + halfEdge_t *startHE = (dcel->faces)[face].start; + halfEdge_t *currentHE = startHE; + int startVertex = startHE->startVertex; + int first = 1; + + /* Loop through the face until the starting vertex is reached */ + while (first || currentHE->startVertex != startVertex) { + enum intersectType typeOfIntersection = \ + intersects(currentHE, bisector, dcel, minLength, &x, &y); + + switch (typeOfIntersection) { + case INTERSECT: + case SAME_LINE_OVERLAP: + case ENDS_OVERLAP: + if (!isIntersectionFound) { + /* First point of intersection */ + isIntersectionFound = 1; + intersection = newIntersection(); + intersection->fromPoint->x = x; + intersection->fromPoint->y = y; + intersection->fromEdge = currentHE->edge; + } else { + /* Second point of intersection */ + intersection->toPoint->x = x; + intersection->toPoint->y = y; + intersection->toEdge = currentHE->edge; + } + break; + case DOESNT_INTERSECT: + default: + break; + } + currentHE = currentHE->next; + first = 0; + } + + return intersection; +} + +intersection_t **getIntersections(intersection_t **intersections, \ + int *numIntersections, bisector_t **bisectors, int numBisectors, \ + DCEL_t *dcel, int face, double minLength) { + + int maxSizeIntersections = 1; + + for (int i = 0; i < numBisectors; i++) { + intersection_t *intersection = NULL; + intersection = getAnIntersection(intersection, dcel, bisectors[i], \ + face, minLength); + + /* If there is an intersection, add it to the array */ + if (intersection != NULL) { + /* Ensure there is enough space in the array */ + if (*numIntersections == maxSizeIntersections) { + maxSizeIntersections *= 2; + intersection_t **temp = realloc(intersections, \ + maxSizeIntersections * sizeof(*intersections)); + checkNullPointer(temp); + intersections = temp; + } + + intersections[*numIntersections] = intersection; + *numIntersections += 1; + } + } + + return intersections; +} + +void freeIntersections(intersection_t **intersections, int numIntersections) { + if (!intersections) { + return; + } + + for (int i = 0; i < numIntersections; i++) { + if (intersections[i]->fromPoint) { + free(intersections[i]->fromPoint); + } + if (intersections[i]->toPoint) { + free(intersections[i]->toPoint); + } + if (intersections[i]) { + free(intersections[i]); + } + } + free(intersections); +} + +/* --------------------- My intersection functions end --------------------- */ + +/* ---------------------- My bisector functions start ---------------------- */ + +bisector_t *newBisector() { + bisector_t *newBisector = malloc(sizeof(*newBisector)); + checkNullPointer(newBisector); + newBisector->mid = malloc(sizeof(*newBisector->mid)); + checkNullPointer(newBisector->mid); + return newBisector; +} + +bisector_t *getABisector(bisector_t *bisector, vertex_t *pointA, \ + vertex_t *pointB) { + + /* Calculate midpoint of the two points */ + bisector->mid->x = (pointA->x + pointB->x) / 2; + bisector->mid->y = (pointA->y + pointB->y) / 2; + + /* Calculating bisector slope according to slope of AB */ + if (pointA->x == pointB->x) { + /* The line segment AB has an infinite gradient, + * so the orthogonal line will have zero slope. + */ + bisector->slope = 0; + bisector->isSlopeInfinite = 0; + } else if (pointA->y == pointB->y) { + /* The line segment AB has gradient of zero, so + * the orthogonal line will have an infinite slope. + */ + bisector->isSlopeInfinite = 1; + + /* Not actually zero, just a placeholder to prevent + * accidental errors + */ + bisector->slope = 0; + } else { + /* The line segment AB has a non-zero and finite gradient, + * so the gradient of the bisector can be calculated. + */ + bisector->isSlopeInfinite = 0; + bisector->slope = -1 / ((pointB->y - pointA->y) / \ + (pointB->x - pointA->x)); + } + + return bisector; +} + +bisector_t **getBisectors(bisector_t **bisectors, vertex_t **points, \ + int numBisectors) { + + for (int i = 0; i < numBisectors; i++) { + bisectors[i] = newBisector(); + bisectors[i] = getABisector(bisectors[i], points[2 * i], \ + points[2 * i + 1]); + } + + return bisectors; +} + +vertex_t *getBisectorPoint(double distance, bisector_t *b, int direction) { + vertex_t *returnPoint = malloc(sizeof(*returnPoint)); + + if (b->isSlopeInfinite) { + /* Vertical line - just add vertical distance */ + returnPoint->x = b->mid->x; + returnPoint->y = b->mid->y + (distance * direction); + } else if (b->slope == 0) { + /* Horizontal line - just add horizontal distance */ + returnPoint->x = b->mid->x + (distance * direction); + returnPoint->y = b->mid->y; + } else { + /* Not horizontal or vertical - add distance to x, then find + * y-intercept of the bisector, and plug it in to y = mx + c to find + * the corresponding y-value. + */ + double c = b->mid->y - b->slope * b->mid->x; + returnPoint->x = b->mid->x + (distance * direction); + returnPoint->y = b->slope * returnPoint->x + c; + } + + return returnPoint; +} + +void freeBisectors(bisector_t **bisectors, int numBisectors) { + if (!bisectors) { + return; + } + + for (int i = 0; i < numBisectors; i++) { + if (bisectors[i]->mid) { + free(bisectors[i]->mid); + } + if (bisectors[i]) { + free(bisectors[i]); + } + } + free(bisectors); +} + +/* ----------------------- My bisector functions end ----------------------- */ + +/* ------------------------ My DCEL functions start ------------------------ */ + +double getDiameter(DCEL_t *dcel, int faceIndex) { + /* firstHE and firstVertex refer to the first HE/vertex from the face used + * to control when the loop stops + * + * startHE and startVertex refer to the starting point used to + * advance the new starting vertex after a complete cycle + * + * currentHE and currentVertex refer to the current HE/vertex being used to + * compute the diameter + */ + halfEdge_t *firstHE = (dcel->faces)[faceIndex].start; + halfEdge_t *startHE = firstHE; + halfEdge_t *currentHE = startHE; + int firstVertex = firstHE->startVertex; + int startVertex = firstVertex; + int currentVertex = startVertex; + int first = 1; + double currentDiameter = NODIAMETER, maxDiameter = NODIAMETER; + + while (first || !(currentHE->startVertex == firstVertex && \ + startHE->startVertex == firstVertex)) { + first = 0; + + /* Compute currentDiameter, compare to maxDiameter */ + currentDiameter = distPoints(&(dcel->vertices)[startVertex], \ + &(dcel->vertices)[currentVertex]); + if (currentDiameter >= maxDiameter) { + maxDiameter = currentDiameter; + } + + /* Advance current HE, update currentVertex */ + currentHE = currentHE->next; + currentVertex = currentHE->startVertex; + + /* When the starting vertex is reached, move the startHE to the next HE + * and update the vertices. + */ + if (currentVertex == startVertex) { + startHE = startHE->next; + currentHE = startHE; + startVertex = startHE->startVertex; + currentVertex = startVertex; + } + } + + if (currentDiameter == NODIAMETER) { + return NODIAMETER; + } + + return maxDiameter; +} + +/* ------------------------- My DCEL functions end ------------------------- */ + +/* ------------------------------------------------------------------------- */ +/* */ +/* Here onwards are the functions from Grady's base code on Ed */ +/* */ +/* ------------------------------------------------------------------------- */ + +DCEL_t *newDCEL() { + /* Setup DCEL. */ + DCEL_t *dcel = malloc(sizeof(*dcel)); + checkNullPointer(dcel); + + dcel->edges = NULL; + dcel->edgesUsed = 0; + dcel->edgesAllocated = 0; + + dcel->faces = NULL; + dcel->facesUsed = 0; + dcel->facesAllocated = 0; + + dcel->vertices = NULL; + dcel->verticesUsed = 0; + dcel->verticesAllocated = 0; + + return dcel; +} + +halfEdge_t *newHalfEdge() { + halfEdge_t *he = malloc(sizeof(*he)); + checkNullPointer(he); + he->startVertex = NOVERTEX; + he->endVertex = NOVERTEX; + he->next = NULL; + he->previous = NULL; + he->twin = NULL; + he->face = NOFACE; + he->edge = NOEDGE; + return he; +} + +void ensureSpaceForVertex(DCEL_t *dcel) { + if (!(dcel->vertices)) { + dcel->vertices = malloc(sizeof(*dcel->vertices) * INITIALVERTICES); + checkNullPointer(dcel->vertices); + dcel->verticesAllocated = INITIALVERTICES; + } else if ((dcel->verticesUsed + 1) > dcel->verticesAllocated) { + dcel->vertices = realloc(dcel->vertices, \ + sizeof(*dcel->vertices) * dcel->verticesAllocated * 2); + checkNullPointer(dcel->vertices); + dcel->verticesAllocated = dcel->verticesAllocated * 2; + } +} + +void ensureSpaceForEdge(DCEL_t *dcel) { + if (!(dcel->edges)) { + dcel->edges = malloc(sizeof(*dcel->edges) * INITIALEDGES); + checkNullPointer(dcel->edges); + dcel->edgesAllocated = INITIALEDGES; + } else if ((dcel->edgesUsed + 1) > dcel->edgesAllocated) { + dcel->edges = realloc(dcel->edges, \ + sizeof(*dcel->edges) * dcel->edgesAllocated * 2); + checkNullPointer(dcel->edges); + dcel->edgesAllocated = dcel->edgesAllocated * 2; + } +} + +void ensureSpaceForFace(DCEL_t *dcel) { + if (!(dcel->faces)) { + dcel->faces = malloc(sizeof(*dcel->faces) * INITIALFACES); + checkNullPointer(dcel->faces); + dcel->facesAllocated = INITIALFACES; + } else if ((dcel->facesUsed + 1) > dcel->facesAllocated) { + dcel->faces = realloc(dcel->faces, \ + sizeof(*dcel->faces) * dcel->facesAllocated * 2); + checkNullPointer(dcel->faces); + dcel->facesAllocated = dcel->facesAllocated * 2; + } +} + +void addEdge(DCEL_t *dcel, int startVertex, int endVertex) { + ensureSpaceForEdge(dcel); + + int newEdge = dcel->edgesUsed; + + halfEdge_t *newHE = newHalfEdge(); + newHE->startVertex = startVertex; + newHE->endVertex = endVertex; + // newHE->next = NULL; + // newHE->previous = NULL; + // newHE->twin = NULL; + // newHE->face = NOFACE; + newHE->edge = newEdge; + + (dcel->edges)[newEdge].halfEdge = newHE; + + dcel->edgesUsed = dcel->edgesUsed + 1; +} + +void addFace(DCEL_t *dcel, halfEdge_t *he) { + ensureSpaceForFace(dcel); + (dcel->faces)[dcel->facesUsed].start = he; + /* Set the face in the half-edges. */ + he->face = dcel->facesUsed; + + (dcel->faces)[dcel->facesUsed].tower = NULL; + + halfEdge_t *current = he->next; + while(current != he) { + current->face = dcel->facesUsed; + current = current->next; + } + + dcel->facesUsed = dcel->facesUsed + 1; +} + +DCEL_t *readPolygonFile(char *polygonfileName) { + DCEL_t *dcel = newDCEL(); + + FILE *polygonFile = fopen(polygonfileName, "r"); + checkNullPointer(polygonFile); + double x; + double y; + + int startVertex = NOVERTEX; + int endVertex = NOVERTEX; + + /* Used to finish off the polygon in the first face. */ + int firstVertex = NOVERTEX; + int firstEdge = NOEDGE; + + while(fscanf(polygonFile, "%lf %lf", &x, &y) == 2) { + ensureSpaceForVertex(dcel); + + (dcel->vertices)[dcel->verticesUsed].x = x; + (dcel->vertices)[dcel->verticesUsed].y = y; + dcel->verticesUsed = dcel->verticesUsed + 1; + + if (startVertex == NOVERTEX) { + startVertex = dcel->verticesUsed - 1; + firstVertex = startVertex; + } else if (endVertex == NOVERTEX) { + /* First edge */ + endVertex = dcel->verticesUsed - 1; + firstEdge = dcel->edgesUsed; + addEdge(dcel, startVertex, endVertex); + } else { + /* Start from last vertex. */ + startVertex = endVertex; + endVertex = dcel->verticesUsed - 1; + addEdge(dcel, startVertex, endVertex); + + /* Connect last edge added to newest edge */ + ((dcel->edges)[dcel->edgesUsed - 2].halfEdge)->next = \ + (dcel->edges)[dcel->edgesUsed - 1].halfEdge; + + /* Connect newest edge to last edge added */ + ((dcel->edges)[dcel->edgesUsed - 1].halfEdge)->previous = \ + (dcel->edges)[dcel->edgesUsed - 2].halfEdge; + } + } + + if (firstEdge == NOEDGE) { + fputs("Error: Unable to create DCEL structure for polygon.\n", stderr); + exit(EXIT_FAILURE); + } + + /* Finalise polygon by adding edge back to first vertex. */ + int finalEdge = dcel->edgesUsed; + addEdge(dcel, endVertex, firstVertex); + + /* Connect previous edge to this edge. */ + ((dcel->edges)[dcel->edgesUsed - 2].halfEdge)->next = \ + (dcel->edges)[dcel->edgesUsed - 1].halfEdge; + + /* Connect newest edge to last edge added */ + ((dcel->edges)[dcel->edgesUsed - 1].halfEdge)->previous = \ + (dcel->edges)[dcel->edgesUsed - 2].halfEdge; + + /* Connect final edge back to start edge. */ + ((dcel->edges)[finalEdge].halfEdge)->next = \ + (dcel->edges)[firstEdge].halfEdge; + + /* Connect start edge back to final edge. */ + ((dcel->edges)[firstEdge].halfEdge)->previous = \ + (dcel->edges)[finalEdge].halfEdge; + + /* Add face to DCEL - could be any edge we constructed, + * so may as well be the first. + */ + addFace(dcel, (dcel->edges)[firstEdge].halfEdge); + if (polygonFile) { + fclose(polygonFile); + } + + return dcel; +} + +split_t *readNextSplit(FILE *splitfile) { + int firstEdge; + int secondEdge; + if (fscanf(splitfile, "%d %d", &firstEdge, &secondEdge) != 2) { + return NULL; + } + split_t *split = malloc(sizeof(*split)); + split->startEdge = firstEdge; + split->endEdge = secondEdge; + split->verticesSpecified = 0; + return split; +} + +void freeSplit(split_t *split) { + if (split) { + free(split); + } +} + +int vertexMatch(vertex_t *v1, vertex_t *v2) { + if (v1->x != v2->x) { + return 0; + } + if (v1->y != v2->y) { + return 0; + } + return 1; +} + +void applySplit(split_t *split, DCEL_t *dcel) { + int isAdjacent; + double midpointX; + double midpointY; + halfEdge_t *startHE; + halfEdge_t *endHE; + halfEdge_t *newJoinHE; + halfEdge_t *newJoinHEPair; + halfEdge_t *newStartHEToMid; + halfEdge_t *newStartHEToMidPair; + halfEdge_t *newMidHEToEnd; + halfEdge_t *newMidHEToEndPair; + /* Temporary holders for old twin edges */ + halfEdge_t *oldStartPairPrev; + halfEdge_t *oldEndPairNext; + /* Temporary holder for old pairs */ + halfEdge_t *oldStartPair; + halfEdge_t *oldEndPair; + + int newVertexMidStart; + int newVertexMidEnd; + /* The vertex representing the end of the original starting edge */ + int oldVertexStart; + /* The vertex representing the start of the original ending edge */ + int oldVertexEnd; + + /* Each split creates exactly 3 edges, so we can set up space for these now. */ + int joinEdge; + int newStartEdge; + int newEndEdge; + + ensureSpaceForEdge(dcel); + joinEdge = dcel->edgesUsed; + dcel->edgesUsed = dcel->edgesUsed + 1; + + ensureSpaceForEdge(dcel); + newStartEdge = dcel->edgesUsed; + dcel->edgesUsed = dcel->edgesUsed + 1; + + ensureSpaceForEdge(dcel); + newEndEdge = dcel->edgesUsed; + dcel->edgesUsed = dcel->edgesUsed + 1; + + /* Get vertices for MidStart and MidEnd */ + ensureSpaceForVertex(dcel); + newVertexMidStart = dcel->verticesUsed; + dcel->verticesUsed = dcel->verticesUsed + 1; + + ensureSpaceForVertex(dcel); + newVertexMidEnd = dcel->verticesUsed; + dcel->verticesUsed = dcel->verticesUsed + 1; + + /* Work out what half-edges we need to use. */ + startHE = (dcel->edges)[split->startEdge].halfEdge; + endHE = (dcel->edges)[split->endEdge].halfEdge; + + /* Set midpoint of start */ + double startX = (dcel->vertices)[startHE->startVertex].x; + double startY = (dcel->vertices)[startHE->startVertex].y; + double endX = (dcel->vertices)[startHE->endVertex].x; + double endY = (dcel->vertices)[startHE->endVertex].y; + if (split->verticesSpecified) { + /* See if vertex needs to be reused */ + if (vertexMatch(&(dcel->vertices)[startHE->endVertex], + &split->startPoint)) { + newVertexMidStart = startHE->endVertex; + } else if (vertexMatch(&(dcel->vertices)[startHE->startVertex], + &split->startPoint)) { + newVertexMidStart = startHE->startVertex; + } else { + (dcel->vertices)[newVertexMidStart].x = split->startPoint.x; + (dcel->vertices)[newVertexMidStart].y = split->startPoint.y; + } + } else { + (dcel->vertices)[newVertexMidStart].x = (startX + endX) / 2.0; + (dcel->vertices)[newVertexMidStart].y = (startY + endY) / 2.0; + } + + + /* Set midpoint of end */ + startX = (dcel->vertices)[endHE->startVertex].x; + startY = (dcel->vertices)[endHE->startVertex].y; + endX = (dcel->vertices)[endHE->endVertex].x; + endY = (dcel->vertices)[endHE->endVertex].y; + if (split->verticesSpecified) { + /* See if vertex needs to be reused */ + if (vertexMatch(&(dcel->vertices)[endHE->startVertex], + &split->endPoint)) { + newVertexMidEnd = endHE->startVertex; + } else if (vertexMatch(&(dcel->vertices)[endHE->endVertex], + &split->endPoint)) { + newVertexMidEnd = endHE->endVertex; + } else { + (dcel->vertices)[newVertexMidEnd].x = split->endPoint.x; + (dcel->vertices)[newVertexMidEnd].y = split->endPoint.y; + } + } else { + (dcel->vertices)[newVertexMidEnd].x = (startX + endX) / 2.0; + (dcel->vertices)[newVertexMidEnd].y = (startY + endY) / 2.0; + } + + + /* Get point halfway between both midpoints */ + double x1 = (dcel->vertices)[newVertexMidStart].x; + double x2 = (dcel->vertices)[newVertexMidEnd].x; + double y1 = (dcel->vertices)[newVertexMidStart].y; + double y2 = (dcel->vertices)[newVertexMidEnd].y; + midpointX = (x1 + x2) / 2.0; + midpointY = (y1 + y2) / 2.0; + + /* Work out whether on correct side. */ + vertex_t *v1 = &((dcel->vertices)[startHE->startVertex]); + vertex_t *v2 = &((dcel->vertices)[startHE->endVertex]); + if (getRelativeDir(midpointX, midpointY, v1, v2) == OUTSIDE) { + startHE = startHE->twin; + } + v1 = &((dcel->vertices)[endHE->startVertex]); + v2 = &((dcel->vertices)[endHE->endVertex]); + if (getRelativeDir(midpointX, midpointY, v1, v2) == OUTSIDE) { + endHE = endHE->twin; + } + + /* Work out whether edges are adjacent. */ + if (startHE->next == endHE) { + isAdjacent = 1; + } else { + isAdjacent = 0; + } + + /* Store old previous and next from start and end edges for convenience */ + halfEdge_t *oldEndPrev = endHE->previous; + halfEdge_t *oldStartNext = startHE->next; + oldVertexEnd = endHE->startVertex; + oldVertexStart = startHE->endVertex; + + /* Update vertices of endHE and startHE */ + endHE->startVertex = newVertexMidEnd; + startHE->endVertex = newVertexMidStart; + + /* Add bridging edges */ + newJoinHE = newHalfEdge(); + + newJoinHE->startVertex = newVertexMidStart; + newJoinHE->endVertex = newVertexMidEnd; + newJoinHE->next = endHE; + endHE->previous = newJoinHE; + newJoinHE->previous = startHE; + startHE->next = newJoinHE; + newJoinHE->twin = NULL; // Will be set later + /* joinHE is same face as startHE and endHE */ + newJoinHE->face = startHE->face; + newJoinHE->edge = joinEdge; + + /* Set joinEdge to relevant halfEdge */ + (dcel->edges)[joinEdge].halfEdge = newJoinHE; + + newJoinHEPair = newHalfEdge(); + /* twin is in opposite direction. */ + newJoinHEPair->startVertex = newVertexMidEnd; + newJoinHEPair->endVertex = newVertexMidStart; + newJoinHEPair->next = NULL; // Will join to new HEs + newJoinHEPair->previous = NULL; // Will join to new HEs + newJoinHEPair->twin = newJoinHE; + newJoinHE->twin = newJoinHEPair; + newJoinHEPair->face = NOFACE; // Will be new face set later + newJoinHEPair->edge = joinEdge; + + /* Set up what we can of new edges */ + newStartHEToMid = newHalfEdge(); + newStartHEToMid->startVertex = newVertexMidStart; + newStartHEToMid->endVertex = oldVertexStart; + newStartHEToMid->next = NULL; // Different setting based on adjacency, set below. + newStartHEToMid->previous = newJoinHEPair; + newJoinHEPair->next = newStartHEToMid; + newStartHEToMid->twin = NULL; // Will be set up later if needed. + newStartHEToMid->face = NOFACE; // Will be new face set later + newStartHEToMid->edge = newStartEdge; + + /* Set newStartEdge to relevant halfEdge */ + (dcel->edges)[newStartEdge].halfEdge = newStartHEToMid; + + newMidHEToEnd = newHalfEdge(); + newMidHEToEnd->startVertex = oldVertexEnd; + newMidHEToEnd->endVertex = newVertexMidEnd; + newMidHEToEnd->next = newJoinHEPair; + newJoinHEPair->previous = newMidHEToEnd; + newMidHEToEnd->previous = NULL; // Different setting based on adjacency, set below. + newMidHEToEnd->twin = NULL; // Will be set up later if needed. + newMidHEToEnd->face = NOFACE; + newMidHEToEnd->edge = newEndEdge; + + /* Set newEndEdge to relevant halfEdge */ + (dcel->edges)[newEndEdge].halfEdge = newMidHEToEnd; + + /* If either start or end HEs have paired Half-Edges, we also need to split those. */ + if (startHE->twin) { + oldStartPairPrev = startHE->twin->previous; + oldStartPair = startHE->twin; + + newStartHEToMidPair = newHalfEdge(); + /* Reverse of twin */ + newStartHEToMidPair->startVertex = oldVertexStart; + newStartHEToMidPair->endVertex = newVertexMidStart; + newStartHEToMidPair->next = oldStartPair; + newStartHEToMidPair->previous = oldStartPairPrev; + startHE->twin->previous = newStartHEToMidPair; + oldStartPair->previous = newStartHEToMidPair; + oldStartPair->startVertex = newVertexMidStart; + oldStartPairPrev->next = newStartHEToMidPair; + newStartHEToMid->twin = newStartHEToMidPair; + newStartHEToMidPair->twin = newStartHEToMid; + newStartHEToMidPair->face = startHE->twin->face; + newStartHEToMidPair->edge = newStartEdge; + } else { + newStartHEToMidPair = NULL; + } + if (endHE->twin) { + oldEndPairNext = endHE->twin->next; + oldEndPair = endHE->twin; + + newMidHEToEndPair = newHalfEdge(); + newMidHEToEndPair->startVertex = newVertexMidEnd; + newMidHEToEndPair->endVertex = oldVertexEnd; + newMidHEToEndPair->next = oldEndPairNext; // endHE->twin ? + oldEndPair->next = newMidHEToEndPair; + oldEndPairNext->previous = newMidHEToEndPair; // Next? + oldEndPair->endVertex = newVertexMidEnd; + newMidHEToEndPair->previous = oldEndPair; + newMidHEToEnd->twin = newMidHEToEndPair; + newMidHEToEndPair->twin = newMidHEToEnd; + newMidHEToEndPair->face = endHE->twin->face; + newMidHEToEndPair->edge = newEndEdge; + } else { + newMidHEToEndPair = NULL; + } + + /* Set up remaining edges. */ + if (isAdjacent) { + newStartHEToMid->next = newMidHEToEnd; + newMidHEToEnd->previous = newStartHEToMid; + } else { + /* Edges are old start and end edges (maybe the same edge). */ + newStartHEToMid->next = oldStartNext; + oldStartNext->previous = newStartHEToMid; + newMidHEToEnd->previous = oldEndPrev; + oldEndPrev->next = newMidHEToEnd; + } + + /* Setup new face. */ + addFace(dcel, newJoinHEPair); + + /* Check if face has overwritten other face */ + int joinFace = startHE->face; + if ((dcel->faces)[joinFace].start->face != joinFace) { + (dcel->faces)[joinFace].start = startHE; + } +} + +void freeDCEL(DCEL_t *dcel) { + if (!dcel) { + return; + } + int i; + if (dcel->edges) { + for(i = 0; i < dcel->edgesUsed; i++) { + if ((dcel->edges)[i].halfEdge) { + if (((dcel->edges)[i]).halfEdge->twin) { + /* Free if edge has two halves. */ + free(((dcel->edges)[i]).halfEdge->twin); + } + free(((dcel->edges)[i]).halfEdge); + } + } + free(dcel->edges); + } + if (dcel->faces) { + /* All edges are freed above, so no need to free each edge here. */ + free(dcel->faces); + } + if (dcel->vertices) { + free(dcel->vertices); + } + free(dcel); +} + +int getFaceCount(DCEL_t *dcel) { + if (!dcel) { + return 0; + } else { + return dcel->facesUsed; + } +} + +int getRelativeDir(double x, double y, vertex_t *v1, vertex_t *v2) { + /* Here we're doing a simple half-plane check against the vector v1->v2. */ + double x1 = v1->x; + double x2 = v2->x; + double y1 = v1->y; + double y2 = v2->y; + if (x1 == x2 && y1 == y2) { + /* Same point. */ + return DIR_UNDECIDED; + } else if (x1 == x2) { + /* y = c line */ + /* Work out whether line is going up or down. */ + if (y2 > y1) { + if (x > x1) { + return INSIDE; + } else if (x < x1) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } else { + if (x < x1) { + return INSIDE; + } else if (x > x1) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } + } else if (y1 == y2) { + /* x = c line */ + /* Work out whether line is going left or right. */ + if (x2 > x1) { + if (y < y1) { + return INSIDE; + } else if (y > y1) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } else { + if (y > y1) { + return INSIDE; + } else if (y < y1) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } + } + + /* + x1, x2, y1, y2 distinct, so see whether point being tested is + above or below gradient line. + */ + double m = (y2 - y1)/(x2 - x1); + double c = y1 - m*x1; + + double predictedY = x * m + c; + double residual = y - predictedY; + + /* + Being inside or outside the polygon depends on the direction + the half-edge is going. + */ + if (x2 > x1) { + if (residual < 0) { + return INSIDE; + } else if (residual > 0) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } else { + if (residual > 0) { + return INSIDE; + } else if (residual < 0) { + return OUTSIDE; + } else { + return DIR_UNDECIDED; + } + } +} + +int directionOrUndecided(int decidedDirection, int direction) { + if (direction == decidedDirection || direction == DIR_UNDECIDED) { + return 1; + } else { + return 0; + } +} + +int inFace(DCEL_t *dcel, double x, double y, int faceIndex) { + if (dcel->facesUsed < faceIndex || !(dcel->faces)[faceIndex].start) { + return OUTSIDE; + } + halfEdge_t *start = (dcel->faces)[faceIndex].start; + int first = 1; + int direction = DIR_UNDECIDED; + + halfEdge_t *current = start; + while(start != current || first) { + if (direction == DIR_UNDECIDED) { + /* Doesn't matter where the point is until we find it on one side or the + other. */ + direction = getRelativeDir(x, y, &(dcel->vertices)[current->startVertex], + &(dcel->vertices)[current->endVertex]); + } else { + if (!directionOrUndecided(direction, + getRelativeDir(x, y, &(dcel->vertices)[current->startVertex], + &(dcel->vertices)[current->endVertex]))) { + /* If the point is on the different side of any edge, it be inside + the face, because the face is convex. */ + return 0; + } + } + current = current->next; + first = 0; + } + + return 1; +} + +/* This intersection is based on code by Joseph O'Rourke and is provided for + * use in COMP20003 Assignment 2. + * + * The approach for intersections is: + * - Use the bisector to construct a finite segment and test it against + * the half-edge. + * - Use O'Rourke's segseg intersection + * (https://hydra.smith.edu/~jorourke/books/ftp.html) to check if the values + * overlap/intersect + * + * Generates a segment with each end at least minLength away in each direction + * from the bisector midpoint. + * + * Returns 1 if b intersects the given half-edge on this segment, 0 otherwise. + * Sets the intersection point to the given x, y positions. + */ + +int areaSign(double sx, double sy, double ex, double ey, double x, double y) { + double areaSq; + /* |AB x AC|^2, squared area */ + /* See https://mathworld.wolfram.com/CrossProduct.html */ + areaSq = (ex - sx) * (y - sy) - + (x - sx) * (ey - sy); + + if (areaSq > 0.0) { + return 1; + } else if (areaSq == 0.0) { + return 0; + } else { + return -1; + } +} + +int between(double sx, double sy, double ex, double ey, double x, double y) { + if (sx != ex) { + /* If not vertical, check whether between x. */ + if ((sx <= x && x <= ex) || (sx >= x && x >= ex)) { + return 1; + } else { + return 0; + } + } else { + /* Vertical, so can't check _between_ x-values. Check y-axis. */ + if ((sy <= y && y <= ey) || (sy >= y && y >= ey)) { + return 1; + } else { + return 0; + } + } +} + +int collinear(double sx, double sy, double ex, double ey, double x, double y) { + /* If area of the parallelogram is 0, then the points + * are in the same line. + */ + if (areaSign(sx, sy, ex, ey, x, y) == 0) { + return 1; + } else { + return 0; + } +} + +enum intersectType parallelIntersects(double heSx, double heSy, \ + double heEx, double heEy, double bSx, double bSy, \ + double bEx, double bEy, double *x, double *y) { + + if (!collinear(heSx, heSy, heEx, heEy, bSx, bSy)) { + /* Parallel, no intersection so don't set (x, y) */ + return DOESNT_INTERSECT; + } + /* bS between heS and heE */ + if (between(heSx, heSy, heEx, heEy, bSx, bSy)) { + *x = bSx; + *y = bSy; + return SAME_LINE_OVERLAP; + } + /* bE between heS and heE */ + if (between(heSx, heSy, heEx, heEy, bEx, bEy)) { + *x = bEx; + *y = bEy; + return SAME_LINE_OVERLAP; + } + /* heS between bS and bE */ + if (between(bSx, bSy, bEx, bEy, heSx, heSy)) { + *x = heSx; + *y = heSy; + return SAME_LINE_OVERLAP; + } + /* heE between bS and bE */ + if (between(bSx, bSy, bEx, bEy, heEx, heEy)) { + *x = heEx; + *y = heEy; + return SAME_LINE_OVERLAP; + } + + return DOESNT_INTERSECT; +} + +enum intersectType intersects(halfEdge_t *he, bisector_t *b, \ + DCEL_t *dcel, double minLength, double *x, double *y) { + + /* Half-edge x, y twin */ + double heSx = dcel->vertices[he->startVertex].x; + double heSy = dcel->vertices[he->startVertex].y; + double heEx = dcel->vertices[he->endVertex].x; + double heEy = dcel->vertices[he->endVertex].y; + + /* Bisector x, y twin */ + vertex_t *startPoint = getBisectorPoint(minLength, b, -1); + vertex_t *endPoint = getBisectorPoint(minLength, b, 1); + double bSx = startPoint->x; + double bSy = startPoint->y; + double bEx = endPoint->x; + double bEy = endPoint->y; + free(startPoint); + free(endPoint); + + /* Parametric equation parameters */ + double t1, t2; + + /* Numerators for X and Y coordinate of intersection. */ + double numeratorX, numeratorY; + + /* Denominators of intersection coordinates. */ + double denominator; + + /* + See http://www.cs.jhu.edu/~misha/Spring20/15.pdf + for explanation and intuition of the algorithm here. + x_1 = heSx, y_1 = heSy | p_1 = heS + x_2 = heEx, y_2 = heEy | q_1 = heE + x_3 = bSx , y_3 = bSy | p_2 = bS + x_4 = bEx , y_4 = bEy | q_2 = bE + ---------------------------------------- + So the parameters t1 and t2 are given by: + | t1 | | heEx - heSx bSx - bEx | -1 | bSx - heSx | + | | = | | | | + | t2 | | heEy - heSy bSy - bEy | | bSy - heSy | + + Hence: + | t1 | 1 | bSy - bEy bEx - bSx | | bSx - heSx | + | | = --------- | | | | + | t2 | ad - bc | heSy - heEy heEx - heSx | | bSy - heSy | + + where + a = heEx - heSx + b = bSx - bEx + c = heEy - heSy + d = bSy - bEy + */ + + /* Here we calculate ad - bc */ + denominator = heSx * (bEy - bSy) + + heEx * (bSy - bEy) + + bEx * (heEy - heSy) + + bSx * (heSy - heEy); + + if (denominator == 0) { + /* In this case the two are parallel */ + return parallelIntersects(heSx, heSy, heEx, heEy, \ + bSx, bSy, bEx, bEy, x, y); + } + + /* + Here we calculate the top row. + | bSy - bEy bEx - bSx | | bSx - heSx | + | | | | + | | | bSy - heSy | + */ + numeratorX = heSx * (bEy - bSy) + + bSx * (heSy - bEy) + + bEx * (bSy - heSy); + + /* + Here we calculate the bottom row. + | | | bSx - heSx | + | | | | + | heSy - heEy heEx - heSx | | bSy - heSy | + */ + numeratorY = -(heSx * (bSy - heEy) + + heEx * (heSy - bSy) + + bSx * (heEy - heSy)); + + /* Use parameters to convert to the intersection point */ + t1 = numeratorX/denominator; + t2 = numeratorY/denominator; + *x = heSx + t1 * (heEx - heSx); + *y = heSy + t1 * (heEy - heSy); + + /* Make final decision - if point is on segments, parameter values will be + between 0, the start of the line segment, and 1, the end of the line segment. + */ + if (0.0 < t1 && t1 < 1.0 && 0.0 < t2 && t2 < 1.0) { + return INTERSECT; + } else if (t1 < 0.0 || 1.0 < t1 || t2 < 0.0 || 1.0 < t2) { + /* s or t outside of line segment. */ + return DOESNT_INTERSECT; + } else { + /* + ((numeratorX == 0) || (numeratorY == 0) || + (numeratorX == denominator) || (numeratorY == denominator)) + */ + return ENDS_OVERLAP; + } +} diff --git a/dcel.h b/src/dcel.h similarity index 96% rename from dcel.h rename to src/dcel.h index 36bbc0e..dbf78ae 100644 --- a/dcel.h +++ b/src/dcel.h @@ -1,258 +1,258 @@ -#ifndef TOWERS_HEADER -#include "towers.h" -#endif - -#ifndef MATH_HEADER -#include -#endif - -#ifndef DCEL_HEADER -#define DCEL_HEADER - -/* -------- Definitions, enums, and structs from Grady's base code --------- */ - -/* Representation of no face */ -#define NOFACE (-1) - -/* Default face for intersections. */ -#define DEFAULT_FACE 0 - -/* Default minimum length for bisector in each direction */ -#define DEFAULTMINLENGTH (200) - -enum intersectType { - DOESNT_INTERSECT = 0, // Doesn't intersect - INTERSECT = 1, // Intersects - SAME_LINE_OVERLAP = 2, // Lines are the same - ENDS_OVERLAP = 3 // Intersects at exactly one point (endpoint) -}; - -typedef struct vertex { - double x; - double y; -} vertex_t; - -typedef struct halfEdge { - struct halfEdge *previous; - struct halfEdge *next; - struct halfEdge *twin; - int face; - int edge; - int startVertex; - int endVertex; -} halfEdge_t; - -typedef struct edge { - halfEdge_t *halfEdge; - tower_t *tower; -} edge_t; - -typedef struct face { - halfEdge_t *start; - tower_t *tower; -} face_t; - -typedef struct split { - int startEdge; - int endEdge; - int verticesSpecified; - vertex_t startPoint; - vertex_t endPoint; -} split_t; - -typedef struct DCEL { - edge_t *edges; - int edgesUsed; - int edgesAllocated; - - face_t *faces; - int facesUsed; - int facesAllocated; - - vertex_t *vertices; - int verticesUsed; - int verticesAllocated; -} DCEL_t; - -/* ------------------------------ My structs ------------------------------- */ - -typedef struct bisector { - vertex_t *mid; - int isSlopeInfinite; - double slope; -} bisector_t; - -typedef struct intersection { - int fromEdge; - int toEdge; - vertex_t *fromPoint; - vertex_t *toPoint; -} intersection_t; - -/* ----------------------- My points functions start ----------------------- */ - -/* Creates a new point */ -vertex_t *newPoint(); - -/* Gets a single point from an x-y pair */ -vertex_t *getAPoint(double x, double y); - -/* Reads a points file and stores the information in the points array */ -vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints); - -/* Frees an array of points */ -void freePoints(vertex_t **points, int numPoints); - -/* Returns the distance between two points */ -double distPoints(vertex_t *pointA, vertex_t *pointB); - -/* ------------------------ My points functions end ------------------------ */ - -/* -------------------- My intersection functions start -------------------- */ - -/* Create a new intersection */ -intersection_t *newIntersection(); - -/* Fills in a single intersection structure */ -intersection_t *getAnIntersection(intersection_t *intersection, DCEL_t *dcel, \ - bisector_t *bisector, int face, int minLength); - -/* Gets the intersection between the given bisector and the given DCEL - * for the given face. - */ -intersection_t **getIntersections(intersection_t **intersections, \ - int *numIntersections, bisector_t **bisectors, int numBisectors, \ - DCEL_t *dcel, int face, double minLength); - -/* Frees an array of intersections */ -void freeIntersections(intersection_t **intersections, int numIntersections); - -/* --------------------- My intersection functions end --------------------- */ - -/* ---------------------- My bisector functions start ---------------------- */ - -/* Creates a new bisector */ -bisector_t *newBisector(); - -/* Calculates and returns the equation of a bisector of two points */ -bisector_t *getABisector(bisector_t *bisector, vertex_t *pointA, \ - vertex_t *pointB); - -/* Returns a list of bisectors built from a list of points */ -bisector_t **getBisectors(bisector_t **bisectors, vertex_t **points, \ - int numPoints); -/* Returns a point at least distance away from the midpoint of the - * bisector given. If direction is 0, then the point is +distance away in the - * x-direction, otherwise -distance away in the x-direction. - */ -vertex_t *getBisectorPoint(double distance, bisector_t *b, int direction); - -/* Frees an array of bisectors */ -void freeBisectors(bisector_t **bisectors, int numBisectors); - -/* ----------------------- My bisector functions end ----------------------- */ - -/* ------------------------ My DCEL functions start ------------------------ */ - -/* Gets the diameter of the given face. */ -double getDiameter(DCEL_t *dcel, int faceIndex); - -/* ------------------------- My DCEL functions end ------------------------- */ - -/* ---------------------------------------------------------------------------- - * Here on out are the functions from Grady's base code on Ed - * ---------------------------------------------------------------------------- - */ - -/* Allocate a new DCEL and return it. */ -DCEL_t *newDCEL(); - -/* Allocate a new halfEdge and return it. */ -halfEdge_t *newHalfEdge(); - -/* Check there's space for another vertex in the DCEL, or increase the - * allocated space. - */ -void ensureSpaceForVertex(DCEL_t *dcel); - -/* Check there's space for another edge in the DCEL, or increase the - * allocated space. - */ -void ensureSpaceForEdge(DCEL_t *dcel); - -/* Check there's space for another face in the DCEL, or increase the - * allocated space. - */ -void ensureSpaceForFace(DCEL_t *dcel); - -/* Add an edge from the startVertex index vertex to the endVertex index. - * Only fills one half-edge as other half-edges will always be added - * through geometry construction. - */ -void addEdge(DCEL_t *dcel, int startVertex, int endVertex); - -/* Add a face to the DCEL given using the given halfEdge and sets the face. */ -void addFace(DCEL_t *dcel, halfEdge_t *he); - -/* Reads the polygon from the given file. */ -DCEL_t *readPolygonFile(char *polygonfileName); - -/* Reads the next split from the given file. */ -split_t *readNextSplit(FILE *splitfile); - -/* Frees a given split. */ -void freeSplit(split_t *split); - -/* Returns 1 if vertices are sufficiently close, 0 otherwise. */ -int vertexMatch(vertex_t *v1, vertex_t *v2); - -/* Applies a given split to the DCEL. */ -void applySplit(split_t *split, DCEL_t *dcel); - -/* Frees the given DCEL */ -void freeDCEL(DCEL_t *dcel); - -/* Gets the number of faces in the DCEL. */ -int getFaceCount(DCEL_t *dcel); - -/* Returns INSIDE if the points is on the INSIDE of the vector twin by the CW - * winding order, OUTSIDE if it is OUTSIDE by the CW winding order, and - * DIR_UNDECIDED if the point lies on the vector between the points v1 and v2. - */ -int getRelativeDir(double x, double y, vertex_t *v1, vertex_t *v2); - -/* Takes an established direction and a new direction, and returns 1 if the - * direction matches the decidedDirection or if the direction is undecided. - */ -int directionOrUndecided(int decidedDirection, int direction); - -/* Returns 1 if the given x,y point is inside the given face. */ -int inFace(DCEL_t *dcel, double x, double y, int faceIndex); - -/* ------------------- O'Rourke's intersection functions ------------------- */ - -/* Returns -1, 0 or 1, based on the area enclosed by the three points. - * 0 corresponds to no area enclosed - */ -int areaSign(double sx, double sy, double ex, double ey, double x, double y); - -/* Returns 1 if point (x, y) is between (sx, sy) and (ex, ey) */ -int between(double sx, double sy, double ex, double ey, double x, double y); - -/* Returns 1 if the point (x, y) is in the line from s(x, y) to e(x, y), - * 0 otherwise - */ -int collinear(double sx, double sy, double ex, double ey, double x, double y); - -/* Tests if the half edge and bisector are parallel and overlapping, or not - * intersecting - */ -enum intersectType parallelIntersects(double heSx, double heSy, \ - double heEx, double heEy, double bSx, double bSy, \ - double bEx, double bEy, double *x, double *y); - -/* Tests if a half edge and a bisector intersect */ -enum intersectType intersects(halfEdge_t *he, bisector_t *b, \ - DCEL_t *dcel, double minLength, double *x, double *y); - -#endif +#ifndef TOWERS_HEADER +#include "towers.h" +#endif + +#ifndef MATH_HEADER +#include +#endif + +#ifndef DCEL_HEADER +#define DCEL_HEADER + +/* -------- Definitions, enums, and structs from Grady's base code --------- */ + +/* Representation of no face */ +#define NOFACE (-1) + +/* Default face for intersections. */ +#define DEFAULT_FACE 0 + +/* Default minimum length for bisector in each direction */ +#define DEFAULTMINLENGTH (200) + +enum intersectType { + DOESNT_INTERSECT = 0, // Doesn't intersect + INTERSECT = 1, // Intersects + SAME_LINE_OVERLAP = 2, // Lines are the same + ENDS_OVERLAP = 3 // Intersects at exactly one point (endpoint) +}; + +typedef struct vertex { + double x; + double y; +} vertex_t; + +typedef struct halfEdge { + struct halfEdge *previous; + struct halfEdge *next; + struct halfEdge *twin; + int face; + int edge; + int startVertex; + int endVertex; +} halfEdge_t; + +typedef struct edge { + halfEdge_t *halfEdge; + tower_t *tower; +} edge_t; + +typedef struct face { + halfEdge_t *start; + tower_t *tower; +} face_t; + +typedef struct split { + int startEdge; + int endEdge; + int verticesSpecified; + vertex_t startPoint; + vertex_t endPoint; +} split_t; + +typedef struct DCEL { + edge_t *edges; + int edgesUsed; + int edgesAllocated; + + face_t *faces; + int facesUsed; + int facesAllocated; + + vertex_t *vertices; + int verticesUsed; + int verticesAllocated; +} DCEL_t; + +/* ------------------------------ My structs ------------------------------- */ + +typedef struct bisector { + vertex_t *mid; + int isSlopeInfinite; + double slope; +} bisector_t; + +typedef struct intersection { + int fromEdge; + int toEdge; + vertex_t *fromPoint; + vertex_t *toPoint; +} intersection_t; + +/* ----------------------- My points functions start ----------------------- */ + +/* Creates a new point */ +vertex_t *newPoint(); + +/* Gets a single point from an x-y pair */ +vertex_t *getAPoint(double x, double y); + +/* Reads a points file and stores the information in the points array */ +vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints); + +/* Frees an array of points */ +void freePoints(vertex_t **points, int numPoints); + +/* Returns the distance between two points */ +double distPoints(vertex_t *pointA, vertex_t *pointB); + +/* ------------------------ My points functions end ------------------------ */ + +/* -------------------- My intersection functions start -------------------- */ + +/* Create a new intersection */ +intersection_t *newIntersection(); + +/* Fills in a single intersection structure */ +intersection_t *getAnIntersection(intersection_t *intersection, DCEL_t *dcel, \ + bisector_t *bisector, int face, int minLength); + +/* Gets the intersection between the given bisector and the given DCEL + * for the given face. + */ +intersection_t **getIntersections(intersection_t **intersections, \ + int *numIntersections, bisector_t **bisectors, int numBisectors, \ + DCEL_t *dcel, int face, double minLength); + +/* Frees an array of intersections */ +void freeIntersections(intersection_t **intersections, int numIntersections); + +/* --------------------- My intersection functions end --------------------- */ + +/* ---------------------- My bisector functions start ---------------------- */ + +/* Creates a new bisector */ +bisector_t *newBisector(); + +/* Calculates and returns the equation of a bisector of two points */ +bisector_t *getABisector(bisector_t *bisector, vertex_t *pointA, \ + vertex_t *pointB); + +/* Returns a list of bisectors built from a list of points */ +bisector_t **getBisectors(bisector_t **bisectors, vertex_t **points, \ + int numPoints); +/* Returns a point at least distance away from the midpoint of the + * bisector given. If direction is 0, then the point is +distance away in the + * x-direction, otherwise -distance away in the x-direction. + */ +vertex_t *getBisectorPoint(double distance, bisector_t *b, int direction); + +/* Frees an array of bisectors */ +void freeBisectors(bisector_t **bisectors, int numBisectors); + +/* ----------------------- My bisector functions end ----------------------- */ + +/* ------------------------ My DCEL functions start ------------------------ */ + +/* Gets the diameter of the given face. */ +double getDiameter(DCEL_t *dcel, int faceIndex); + +/* ------------------------- My DCEL functions end ------------------------- */ + +/* ---------------------------------------------------------------------------- + * Here on out are the functions from Grady's base code on Ed + * ---------------------------------------------------------------------------- + */ + +/* Allocate a new DCEL and return it. */ +DCEL_t *newDCEL(); + +/* Allocate a new halfEdge and return it. */ +halfEdge_t *newHalfEdge(); + +/* Check there's space for another vertex in the DCEL, or increase the + * allocated space. + */ +void ensureSpaceForVertex(DCEL_t *dcel); + +/* Check there's space for another edge in the DCEL, or increase the + * allocated space. + */ +void ensureSpaceForEdge(DCEL_t *dcel); + +/* Check there's space for another face in the DCEL, or increase the + * allocated space. + */ +void ensureSpaceForFace(DCEL_t *dcel); + +/* Add an edge from the startVertex index vertex to the endVertex index. + * Only fills one half-edge as other half-edges will always be added + * through geometry construction. + */ +void addEdge(DCEL_t *dcel, int startVertex, int endVertex); + +/* Add a face to the DCEL given using the given halfEdge and sets the face. */ +void addFace(DCEL_t *dcel, halfEdge_t *he); + +/* Reads the polygon from the given file. */ +DCEL_t *readPolygonFile(char *polygonfileName); + +/* Reads the next split from the given file. */ +split_t *readNextSplit(FILE *splitfile); + +/* Frees a given split. */ +void freeSplit(split_t *split); + +/* Returns 1 if vertices are sufficiently close, 0 otherwise. */ +int vertexMatch(vertex_t *v1, vertex_t *v2); + +/* Applies a given split to the DCEL. */ +void applySplit(split_t *split, DCEL_t *dcel); + +/* Frees the given DCEL */ +void freeDCEL(DCEL_t *dcel); + +/* Gets the number of faces in the DCEL. */ +int getFaceCount(DCEL_t *dcel); + +/* Returns INSIDE if the points is on the INSIDE of the vector twin by the CW + * winding order, OUTSIDE if it is OUTSIDE by the CW winding order, and + * DIR_UNDECIDED if the point lies on the vector between the points v1 and v2. + */ +int getRelativeDir(double x, double y, vertex_t *v1, vertex_t *v2); + +/* Takes an established direction and a new direction, and returns 1 if the + * direction matches the decidedDirection or if the direction is undecided. + */ +int directionOrUndecided(int decidedDirection, int direction); + +/* Returns 1 if the given x,y point is inside the given face. */ +int inFace(DCEL_t *dcel, double x, double y, int faceIndex); + +/* ------------------- O'Rourke's intersection functions ------------------- */ + +/* Returns -1, 0 or 1, based on the area enclosed by the three points. + * 0 corresponds to no area enclosed + */ +int areaSign(double sx, double sy, double ex, double ey, double x, double y); + +/* Returns 1 if point (x, y) is between (sx, sy) and (ex, ey) */ +int between(double sx, double sy, double ex, double ey, double x, double y); + +/* Returns 1 if the point (x, y) is in the line from s(x, y) to e(x, y), + * 0 otherwise + */ +int collinear(double sx, double sy, double ex, double ey, double x, double y); + +/* Tests if the half edge and bisector are parallel and overlapping, or not + * intersecting + */ +enum intersectType parallelIntersects(double heSx, double heSy, \ + double heEx, double heEy, double bSx, double bSy, \ + double bEx, double bEy, double *x, double *y); + +/* Tests if a half edge and a bisector intersect */ +enum intersectType intersects(halfEdge_t *he, bisector_t *b, \ + DCEL_t *dcel, double minLength, double *x, double *y); + +#endif diff --git a/input.c b/src/input.c similarity index 97% rename from input.c rename to src/input.c index 5a5927d..dc208c6 100644 --- a/input.c +++ b/src/input.c @@ -1,92 +1,92 @@ -/* input.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 8th September 2021 - * Last modified 14th September 2021 - * - * Contains functions for ensuring correct input arguments are given for - * each stage of the voronoi2 program. Adapted from Grady's base code on Ed. - * - */ - -#ifndef INPUT_HEADER -#include "input.h" -#endif - -#define STAGE_1_ARG_COUNT 4 -#define STAGE_2_ARG_COUNT 5 -#define STAGE_3_ARG_COUNT 5 -#define STAGE_4_ARG_COUNT 5 - -enum stages getStage(char *stage) { - if (strcmp(stage, "1") == 0){ - return STAGE_1; - } else if (strcmp(stage, "2") == 0){ - return STAGE_2; - } else if (strcmp(stage, "3") == 0){ - return STAGE_3; - } else if (strcmp(stage, "4") == 0){ - return STAGE_4; - } else { - return STAGE_ERROR; - } -} - -void printArgError(enum stages stage, char *errorMessage) { - fprintf(stderr, "Error: %s\n\n", errorMessage); - - /* Stage 1 - Print bisector equations */ - if (stage == STAGE_ERROR || stage == STAGE_1) { - fputs("./voronoi2 1 pointsFile outputFile\n" - "\tTo output the bisectors for the given pointsFile to the \n" - "\tgiven outputFile.\n\n", stderr); - } - - /* Stage 2 - Print intersections between bisectors and polygon */ - if (stage == STAGE_ERROR || stage == STAGE_2) { - fputs("./voronoi2 2 pointsFile polygonFile outputFile\n" - "\tTo output the intersections the given bisectors make with \n" - "\tthe polygon to the given outputFile.\n\n", stderr); - } - - /* Stage 3: Print diameter of each face, constructing using - * incremental method - */ - if (stage == STAGE_ERROR || stage == STAGE_3) { - fputs("./voronoi2 3 dataFile polygonFile outputFile\n" - "\tTo generate the initial polygon in polygonFile, layout the \n" - "\twatchtower points in the dataFile on the polygon, generate \n" - "\the voronoi diagram, adding or modifying the polydon so that \n" - "\ta voronoi diagram is constructed, seperating all points \n" - "\tinto their own cell with all tpoints in the cell being \n" - "\tclosest to the watchtower in the cell. The watchtower data \n" - "\tand its diameter is output to the outputFile.\n\n", stderr); - } - - /* Stage 4 - Sort by diameter */ - if (stage == STAGE_ERROR || stage == STAGE_4) { - fputs("./voronoi2 4 dataFile polygonFile outputFile\n" - "\tSame as stage 3, but output watchtowers are in order of \n" - "\tdiameter, smallest to largest.\n\n", stderr); - } - - exit(EXIT_FAILURE); -} - -int getExpectedArgs(enum stages stage) { - switch(stage){ - case STAGE_1: - return STAGE_1_ARG_COUNT; - case STAGE_2: - return STAGE_2_ARG_COUNT; - case STAGE_3: - return STAGE_3_ARG_COUNT; - case STAGE_4: - return STAGE_4_ARG_COUNT; - case STAGE_ERROR: - default: - printArgError(stage, "Invalid stage number."); - exit(EXIT_FAILURE); - } - return -1; -} +/* input.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 8th September 2021 + * Last modified 14th September 2021 + * + * Contains functions for ensuring correct input arguments are given for + * each stage of the voronoi2 program. Adapted from Grady's base code on Ed. + * + */ + +#ifndef INPUT_HEADER +#include "input.h" +#endif + +#define STAGE_1_ARG_COUNT 4 +#define STAGE_2_ARG_COUNT 5 +#define STAGE_3_ARG_COUNT 5 +#define STAGE_4_ARG_COUNT 5 + +enum stages getStage(char *stage) { + if (strcmp(stage, "1") == 0){ + return STAGE_1; + } else if (strcmp(stage, "2") == 0){ + return STAGE_2; + } else if (strcmp(stage, "3") == 0){ + return STAGE_3; + } else if (strcmp(stage, "4") == 0){ + return STAGE_4; + } else { + return STAGE_ERROR; + } +} + +void printArgError(enum stages stage, char *errorMessage) { + fprintf(stderr, "Error: %s\n\n", errorMessage); + + /* Stage 1 - Print bisector equations */ + if (stage == STAGE_ERROR || stage == STAGE_1) { + fputs("./voronoi2 1 pointsFile outputFile\n" + "\tTo output the bisectors for the given pointsFile to the \n" + "\tgiven outputFile.\n\n", stderr); + } + + /* Stage 2 - Print intersections between bisectors and polygon */ + if (stage == STAGE_ERROR || stage == STAGE_2) { + fputs("./voronoi2 2 pointsFile polygonFile outputFile\n" + "\tTo output the intersections the given bisectors make with \n" + "\tthe polygon to the given outputFile.\n\n", stderr); + } + + /* Stage 3: Print diameter of each face, constructing using + * incremental method + */ + if (stage == STAGE_ERROR || stage == STAGE_3) { + fputs("./voronoi2 3 dataFile polygonFile outputFile\n" + "\tTo generate the initial polygon in polygonFile, layout the \n" + "\twatchtower points in the dataFile on the polygon, generate \n" + "\the voronoi diagram, adding or modifying the polydon so that \n" + "\ta voronoi diagram is constructed, seperating all points \n" + "\tinto their own cell with all tpoints in the cell being \n" + "\tclosest to the watchtower in the cell. The watchtower data \n" + "\tand its diameter is output to the outputFile.\n\n", stderr); + } + + /* Stage 4 - Sort by diameter */ + if (stage == STAGE_ERROR || stage == STAGE_4) { + fputs("./voronoi2 4 dataFile polygonFile outputFile\n" + "\tSame as stage 3, but output watchtowers are in order of \n" + "\tdiameter, smallest to largest.\n\n", stderr); + } + + exit(EXIT_FAILURE); +} + +int getExpectedArgs(enum stages stage) { + switch(stage){ + case STAGE_1: + return STAGE_1_ARG_COUNT; + case STAGE_2: + return STAGE_2_ARG_COUNT; + case STAGE_3: + return STAGE_3_ARG_COUNT; + case STAGE_4: + return STAGE_4_ARG_COUNT; + case STAGE_ERROR: + default: + printArgError(stage, "Invalid stage number."); + exit(EXIT_FAILURE); + } + return -1; +} diff --git a/input.h b/src/input.h similarity index 95% rename from input.h rename to src/input.h index 0d277ab..554dc99 100644 --- a/input.h +++ b/src/input.h @@ -1,28 +1,28 @@ -#ifndef COMMON_HEADER -#include "common.h" -#endif - -#ifndef INPUT_HEADER -#define INPUT_HEADER - -enum stages { - STAGE_1 = 1, - STAGE_2 = 2, - STAGE_3 = 3, - STAGE_4 = 4, - STAGE_ERROR = -1 -}; - -/* Gets the current stage from the command-line argument */ -enum stages getStage(char *stage); - -/* Checks the validity of the command line input arguments */ -void checkInputArgs(int argc, char **argv); - -/* Gets the expected number of arguments for a given stage */ -int getExpectedArgs(enum stages stage); - -/* Prints the corresponding usage strings for a given stage */ -void printArgError(enum stages stage, char *errorMessage); - -#endif +#ifndef COMMON_HEADER +#include "common.h" +#endif + +#ifndef INPUT_HEADER +#define INPUT_HEADER + +enum stages { + STAGE_1 = 1, + STAGE_2 = 2, + STAGE_3 = 3, + STAGE_4 = 4, + STAGE_ERROR = -1 +}; + +/* Gets the current stage from the command-line argument */ +enum stages getStage(char *stage); + +/* Checks the validity of the command line input arguments */ +void checkInputArgs(int argc, char **argv); + +/* Gets the expected number of arguments for a given stage */ +int getExpectedArgs(enum stages stage); + +/* Prints the corresponding usage strings for a given stage */ +void printArgError(enum stages stage, char *errorMessage); + +#endif diff --git a/main.c b/src/main.c similarity index 96% rename from main.c rename to src/main.c index 73b666f..18577ab 100644 --- a/main.c +++ b/src/main.c @@ -1,71 +1,71 @@ -/* main.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 25th August 2021 - * Last modified 14th September 2021 - * - * Stage 1: Computes and outputs equations for the bisectors of points - * Stage 2: Computes and outputs intersection points for bisectors against a - * given polygon - * Stage 3: Computes a Voronoi diagram using watchtowers as points and a - * polygon as the outer boundary. Outputs diameters of each Voronoi - * cell along with information about each watchtower. - * Stage 4: Same as Stage 4, but the watchtowers are sorted by ascending order - * by diameter. - * - * To see valid input arguments, run ./voronoi2 - * - */ - -#ifndef VORONOI_HEADER -#include "voronoi.h" -#endif - -#ifndef INPUT_HEADER -#include "input.h" -#endif - -int main(int argc, char **argv) { - /* Ensure input arguments are correct */ - if (argc == 1) { - printArgError(STAGE_ERROR, "Incorrect usage."); - } - - /* Get stage, ensure correct input args */ - enum stages stage = getStage(argv[1]); - int expectedArgs = getExpectedArgs(stage); - if (expectedArgs != argc) { - printArgError(stage, "Incorrect number of inputs."); - } - - /* Then run the program according to the stage given */ - switch(stage) { - /* Expected usage: ./voronoi2 1 pointsFile outputFile */ - case STAGE_1: - stage1(argv[2], argv[3]); - break; - - /* Expected usage: ./voronoi2 2 pointsFile polygonFile outputFile */ - case STAGE_2: - stage2(argv[2], argv[3], argv[4]); - break; - - /* Expected usage: ./voronoi2 3 dataFile polygonFile outputFile */ - case STAGE_3: - stage3(argv[2], argv[3], argv[4]); - break; - - /* Expected usage: /voronoi2 4 dataFile polygonFile outputFile */ - case STAGE_4: - stage4(argv[2], argv[3], argv[4]); - break; - - /* Return error if stage number isn't defined. */ - case STAGE_ERROR: - default: - printArgError(stage, "Invalid stage entered."); - exit(EXIT_FAILURE); - } - - return 0; -} +/* main.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 25th August 2021 + * Last modified 14th September 2021 + * + * Stage 1: Computes and outputs equations for the bisectors of points + * Stage 2: Computes and outputs intersection points for bisectors against a + * given polygon + * Stage 3: Computes a Voronoi diagram using watchtowers as points and a + * polygon as the outer boundary. Outputs diameters of each Voronoi + * cell along with information about each watchtower. + * Stage 4: Same as Stage 4, but the watchtowers are sorted by ascending order + * by diameter. + * + * To see valid input arguments, run ./voronoi2 + * + */ + +#ifndef VORONOI_HEADER +#include "voronoi.h" +#endif + +#ifndef INPUT_HEADER +#include "input.h" +#endif + +int main(int argc, char **argv) { + /* Ensure input arguments are correct */ + if (argc == 1) { + printArgError(STAGE_ERROR, "Incorrect usage."); + } + + /* Get stage, ensure correct input args */ + enum stages stage = getStage(argv[1]); + int expectedArgs = getExpectedArgs(stage); + if (expectedArgs != argc) { + printArgError(stage, "Incorrect number of inputs."); + } + + /* Then run the program according to the stage given */ + switch(stage) { + /* Expected usage: ./voronoi2 1 pointsFile outputFile */ + case STAGE_1: + stage1(argv[2], argv[3]); + break; + + /* Expected usage: ./voronoi2 2 pointsFile polygonFile outputFile */ + case STAGE_2: + stage2(argv[2], argv[3], argv[4]); + break; + + /* Expected usage: ./voronoi2 3 dataFile polygonFile outputFile */ + case STAGE_3: + stage3(argv[2], argv[3], argv[4]); + break; + + /* Expected usage: /voronoi2 4 dataFile polygonFile outputFile */ + case STAGE_4: + stage4(argv[2], argv[3], argv[4]); + break; + + /* Return error if stage number isn't defined. */ + case STAGE_ERROR: + default: + printArgError(stage, "Invalid stage entered."); + exit(EXIT_FAILURE); + } + + return 0; +} diff --git a/towers.c b/src/towers.c similarity index 96% rename from towers.c rename to src/towers.c index 60527ce..92b1a8a 100644 --- a/towers.c +++ b/src/towers.c @@ -1,115 +1,115 @@ -/* voronoi.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 11th September 2021 - * Last modified 14th September 2021 - * - * Contains functions for reading a CSV of watchtower information into an - * array of towers. - * - */ - -#ifndef TOWERS_HEADER -#include "towers.h" -#endif - -#define BASE_10 10 -#define MAX_CSV_ENTRY_LEN 512 -#define MAX_FIELD_LEN 128 -#define NUM_CSV_FIELDS 6 - -void readATower(char *lineBuffer, tower_t *tower) { - /* Stores the current CSV field for the current line */ - char *token = strtok(lineBuffer, ","); - size_t tokenLength; - - for (int i = 0; i < NUM_CSV_FIELDS; i++) { - tokenLength = strlen(token); - switch(i) { - /* Cases represent each field in the CSV, and as such are handled - * differently. - */ - case 0: - tower->id = malloc(sizeof(char) * tokenLength + 1); - checkNullPointer(tower->id); - strcpy(tower->id, token); - tower->id[tokenLength] = '\0'; - break; - case 1: - tower->postcode = malloc(sizeof(char) * tokenLength + 1); - checkNullPointer(tower->postcode); - strcpy(tower->postcode, token); - tower->postcode[tokenLength] = '\0'; - break; - case 2: - tower->population = strtol(token, NULL, BASE_10); - break; - case 3: - tower->manager = malloc(sizeof(char) * tokenLength + 1); - checkNullPointer(tower->manager); - strcpy(tower->manager, token); - tower->manager[tokenLength] = '\0'; - break; - case 4: - tower->x = strtod(token, NULL); - break; - case 5: - tower->y = strtod(token, NULL); - break; - } - token = strtok(NULL, ","); - } -} - -tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers) { - /* Maximum length of a single CSV line (+1 for null char in string) */ - size_t lineBufferSize = MAX_CSV_ENTRY_LEN + 1; - - /* Stores the current line from the CSV */ - char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); - checkNullPointer(lineBuffer); - - int maxSizetowers = 1; - - /* Discard the header line, then read the rest of the CSV */ - getline(&lineBuffer, &lineBufferSize, datasetFile); - while (getline(&lineBuffer, &lineBufferSize, datasetFile) > 0) { - /* Ensure there is enough space in the towers array */ - if (*numTowers == maxSizetowers) { - maxSizetowers *= 2; - tower_t **temp = realloc(towers, maxSizetowers * sizeof(*towers)); - checkNullPointer(temp); - towers = temp; - } - - /* The current tower being filled in with information */ - towers[*numTowers] = malloc(sizeof(*towers[*numTowers])); - - readATower(lineBuffer, towers[*numTowers]); - *numTowers += 1; - } - free(lineBuffer); - return towers; -} - -void freeTowers(tower_t **towers, int numTowers) { - if (!towers) { - return; - } - - for (int i = 0; i < numTowers; i++) { - if (towers[i]->id) { - free(towers[i]->id); - } - if (towers[i]->manager) { - free(towers[i]->manager); - } - if (towers[i]->postcode) { - free(towers[i]->postcode); - } - if (towers[i]) { - free(towers[i]); - } - } - free(towers); -} +/* voronoi.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 11th September 2021 + * Last modified 14th September 2021 + * + * Contains functions for reading a CSV of watchtower information into an + * array of towers. + * + */ + +#ifndef TOWERS_HEADER +#include "towers.h" +#endif + +#define BASE_10 10 +#define MAX_CSV_ENTRY_LEN 512 +#define MAX_FIELD_LEN 128 +#define NUM_CSV_FIELDS 6 + +void readATower(char *lineBuffer, tower_t *tower) { + /* Stores the current CSV field for the current line */ + char *token = strtok(lineBuffer, ","); + size_t tokenLength; + + for (int i = 0; i < NUM_CSV_FIELDS; i++) { + tokenLength = strlen(token); + switch(i) { + /* Cases represent each field in the CSV, and as such are handled + * differently. + */ + case 0: + tower->id = malloc(sizeof(char) * tokenLength + 1); + checkNullPointer(tower->id); + strcpy(tower->id, token); + tower->id[tokenLength] = '\0'; + break; + case 1: + tower->postcode = malloc(sizeof(char) * tokenLength + 1); + checkNullPointer(tower->postcode); + strcpy(tower->postcode, token); + tower->postcode[tokenLength] = '\0'; + break; + case 2: + tower->population = strtol(token, NULL, BASE_10); + break; + case 3: + tower->manager = malloc(sizeof(char) * tokenLength + 1); + checkNullPointer(tower->manager); + strcpy(tower->manager, token); + tower->manager[tokenLength] = '\0'; + break; + case 4: + tower->x = strtod(token, NULL); + break; + case 5: + tower->y = strtod(token, NULL); + break; + } + token = strtok(NULL, ","); + } +} + +tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers) { + /* Maximum length of a single CSV line (+1 for null char in string) */ + size_t lineBufferSize = MAX_CSV_ENTRY_LEN + 1; + + /* Stores the current line from the CSV */ + char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); + checkNullPointer(lineBuffer); + + int maxSizetowers = 1; + + /* Discard the header line, then read the rest of the CSV */ + getline(&lineBuffer, &lineBufferSize, datasetFile); + while (getline(&lineBuffer, &lineBufferSize, datasetFile) > 0) { + /* Ensure there is enough space in the towers array */ + if (*numTowers == maxSizetowers) { + maxSizetowers *= 2; + tower_t **temp = realloc(towers, maxSizetowers * sizeof(*towers)); + checkNullPointer(temp); + towers = temp; + } + + /* The current tower being filled in with information */ + towers[*numTowers] = malloc(sizeof(*towers[*numTowers])); + + readATower(lineBuffer, towers[*numTowers]); + *numTowers += 1; + } + free(lineBuffer); + return towers; +} + +void freeTowers(tower_t **towers, int numTowers) { + if (!towers) { + return; + } + + for (int i = 0; i < numTowers; i++) { + if (towers[i]->id) { + free(towers[i]->id); + } + if (towers[i]->manager) { + free(towers[i]->manager); + } + if (towers[i]->postcode) { + free(towers[i]->postcode); + } + if (towers[i]) { + free(towers[i]); + } + } + free(towers); +} diff --git a/towers.h b/src/towers.h similarity index 95% rename from towers.h rename to src/towers.h index 967c903..31e136f 100644 --- a/towers.h +++ b/src/towers.h @@ -1,26 +1,26 @@ -#ifndef COMMON_HEADER -#include "common.h" -#endif - -#ifndef TOWERS_HEADER -#define TOWERS_HEADER - -typedef struct tower { - char *id; - char *postcode; - char *manager; - int population; - double x; - double y; -} tower_t; - -/* Reads the current row from the CSV and converts it into a new tower */ -void readATower(char *lineBuffer, tower_t *tower); - -/* Reads the CSV file and stores the information in the towers array */ -tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers); - -/* Frees all towers in a towers array */ -void freeTowers(tower_t **towers, int numTowers); - -#endif +#ifndef COMMON_HEADER +#include "common.h" +#endif + +#ifndef TOWERS_HEADER +#define TOWERS_HEADER + +typedef struct tower { + char *id; + char *postcode; + char *manager; + int population; + double x; + double y; +} tower_t; + +/* Reads the current row from the CSV and converts it into a new tower */ +void readATower(char *lineBuffer, tower_t *tower); + +/* Reads the CSV file and stores the information in the towers array */ +tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers); + +/* Frees all towers in a towers array */ +void freeTowers(tower_t **towers, int numTowers); + +#endif diff --git a/voronoi.c b/src/voronoi.c similarity index 97% rename from voronoi.c rename to src/voronoi.c index e97cc3c..0c2c527 100644 --- a/voronoi.c +++ b/src/voronoi.c @@ -1,208 +1,208 @@ -/* voronoi.c - * - * Created by Rory Healy (healyr@student.unimelb.edu.au) - * Created on 12th August 2021 - * Last modified 14th September 2021 - * - * Contains functions involving the generation of the Voronoi diagram, and - * running each stage of the assignment. - * - */ - -#ifndef VORONOI_HEADER -#include "voronoi.h" -#endif - -void stage1PrintBisector(bisector_t *bisector, FILE *outputFile) { - if (bisector->isSlopeInfinite) { - /* Cannot print infinite slope, so print only x-intercept */ - fprintf(outputFile, "x = %lf\n", bisector->mid->x); - } else { - fprintf(outputFile, "y = %lf * (x - %lf) + %lf\n", \ - bisector->slope, bisector->mid->x, bisector->mid->y); - } -} - -void stage2PrintIntersection(intersection_t *intersection, FILE *outputFile) { - fprintf(outputFile, "From Edge %d (%lf, %lf) to Edge %d (%lf, %lf)\n", \ - intersection->fromEdge, intersection->fromPoint->x, \ - intersection->fromPoint->y, intersection->toEdge, \ - intersection->toPoint->x, intersection->toPoint->y); -} - -void stage34PrintTowers(tower_t *tower, FILE *outputFile, double diameter) { - fprintf(outputFile, "Watchtower ID: %s, Postcode: %s, Population " \ - "Served: %d, Watchtower Point of Contact Name: %s, x: %lf, y: %lf, " \ - "Diameter of Cell: %lf\n", tower->id, tower->postcode, \ - tower->population, tower->manager, tower->x, tower->y, diameter); -} - -int getFaceTowerIsIn(DCEL_t *dcel, tower_t *tower) { - for (int i = 0; i < getFaceCount(dcel); i++) { - if (inFace(dcel, tower->x, tower->y, i)) { - return i; - } - } - return -1; -} - -void incrementalVoronoi(DCEL_t *voronoi, tower_t *tower) { - int faceTowerIsIn = getFaceTowerIsIn(voronoi, tower); - if (faceTowerIsIn == -1) { - fprintf(stderr, "Error: Watchtower %s is outside the polygon.\n", \ - tower->id); - exit(EXIT_FAILURE); - } -} - -DCEL_t *newVoronoi(DCEL_t *voronoi, tower_t *towerA, tower_t *towerB) { - /* Get vertices from towers */ - vertex_t *pointA = getAPoint(towerA->x, towerA->y); - vertex_t *pointB = getAPoint(towerB->x, towerB->y); - - /* Create first bisector */ - bisector_t *bisector = newBisector(); - bisector = getABisector(bisector, pointA, pointB); - - /* Get intersection of bisector with the polygon */ - intersection_t *intersection = NULL; - intersection = getAnIntersection(intersection, voronoi, bisector, \ - DEFAULT_FACE, DEFAULTMINLENGTH); - - if (intersection) { - free(intersection->fromPoint); - free(intersection->toPoint); - free(intersection); - } - - free(bisector->mid); - free(bisector); - free(pointA); - free(pointB); - return voronoi; -} - -void stage1(char *pointsFileName, char *outputFileName) { - FILE *pointsFile = NULL, *outputFile = NULL; - pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); - outputFile = safeFileOpen(&outputFile, outputFileName, "w"); - - /* Points are given as pairs, so initialise 2 points */ - vertex_t **points = malloc(sizeof(*points) * 2); - checkNullPointer(points); - int numPoints = 0; - points = readPoints(points, pointsFile, &numPoints); - - /* There are half as many bisectors as points */ - int numBisectors = numPoints / 2; - bisector_t **bisectors = malloc(sizeof(*bisectors) * numBisectors); - checkNullPointer(bisectors); - bisectors = getBisectors(bisectors, points, numBisectors); - - /* For each pair, calculate and print the bisector to outputFile */ - for (int i = 0; i < numBisectors; i++) { - stage1PrintBisector(bisectors[i], outputFile); - } - - /* Clean up */ - freePoints(points, numPoints); - freeBisectors(bisectors, numBisectors); - fclose(pointsFile); - fclose(outputFile); -} - -void stage2(char *pointsFileName, char *polygonFileName, \ - char *outputFileName) { - - FILE *pointsFile = NULL, *outputFile = NULL; - pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); - outputFile = safeFileOpen(&outputFile, outputFileName, "w"); - - /* Points are given as pairs, so initialise 2 points */ - vertex_t **points = malloc(sizeof(*points) * 2); - checkNullPointer(points); - int numPoints = 0; - points = readPoints(points, pointsFile, &numPoints); - - /* There are half as many bisectors as points */ - int numBisectors = numPoints / 2; - bisector_t **bisectors = malloc(sizeof(*bisectors) * numBisectors); - checkNullPointer(bisectors); - bisectors = getBisectors(bisectors, points, numBisectors); - - /* Construct the DCEL from the polygon file */ - DCEL_t *dcel = readPolygonFile(polygonFileName); - - /* Calculate and print intersections to the output file */ - intersection_t **intersections = malloc(sizeof(*intersections)); - checkNullPointer(intersections); - int numIntersections = 0; - intersections = getIntersections(intersections, &numIntersections, \ - bisectors, numBisectors, dcel, DEFAULT_FACE, DEFAULTMINLENGTH); - - for (int i = 0; i < numIntersections; i++) { - stage2PrintIntersection(intersections[i], outputFile); - } - - /* Clean up */ - freePoints(points, numPoints); - freeBisectors(bisectors, numBisectors); - freeIntersections(intersections, numIntersections); - freeDCEL(dcel); - fclose(pointsFile); - fclose(outputFile); -} - -void stage3(char *dataFileName, char *polygonFileName, char *outputFileName) { - FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; - dataFile = safeFileOpen(&dataFile, dataFileName, "r"); - polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); - outputFile = safeFileOpen(&outputFile, outputFileName, "w"); - - /* Read towers from the data file */ - tower_t **towers = malloc(sizeof(*towers)); - checkNullPointer(towers); - int numTowers = 0; - towers = readTowers(towers, dataFile, &numTowers); - - /* Construct the DCEL from the polygon file */ - DCEL_t *dcel = readPolygonFile(polygonFileName); - - /* Add each tower to the Voronoi DCEL */ - - /* Get diameters and output to outputFile */ - - /* Clean up */ - freeDCEL(dcel); - freeTowers(towers, numTowers); - fclose(dataFile); - fclose(polygonFile); - fclose(outputFile); -} - -void stage4(char *dataFileName, char *polygonFileName, char *outputFileName) { - FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; - dataFile = safeFileOpen(&dataFile, dataFileName, "r"); - polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); - outputFile = safeFileOpen(&outputFile, outputFileName, "w"); - - /* Read towers from the data file */ - tower_t **towers = malloc(sizeof(*towers)); - checkNullPointer(towers); - int numTowers = 0; - towers = readTowers(towers, dataFile, &numTowers); - - /* Construct the DCEL from the polygon file */ - DCEL_t *dcel = readPolygonFile(polygonFileName); - - /* Add each tower to the Voronoi DCEL */ - - /* Get diameters and sort, then output to outputFile */ - - /* Clean up */ - freeDCEL(dcel); - freeTowers(towers, numTowers); - fclose(dataFile); - fclose(polygonFile); - fclose(outputFile); -} +/* voronoi.c + * + * Created by Rory Healy (healyr@student.unimelb.edu.au) + * Created on 12th August 2021 + * Last modified 14th September 2021 + * + * Contains functions involving the generation of the Voronoi diagram, and + * running each stage of the assignment. + * + */ + +#ifndef VORONOI_HEADER +#include "voronoi.h" +#endif + +void stage1PrintBisector(bisector_t *bisector, FILE *outputFile) { + if (bisector->isSlopeInfinite) { + /* Cannot print infinite slope, so print only x-intercept */ + fprintf(outputFile, "x = %lf\n", bisector->mid->x); + } else { + fprintf(outputFile, "y = %lf * (x - %lf) + %lf\n", \ + bisector->slope, bisector->mid->x, bisector->mid->y); + } +} + +void stage2PrintIntersection(intersection_t *intersection, FILE *outputFile) { + fprintf(outputFile, "From Edge %d (%lf, %lf) to Edge %d (%lf, %lf)\n", \ + intersection->fromEdge, intersection->fromPoint->x, \ + intersection->fromPoint->y, intersection->toEdge, \ + intersection->toPoint->x, intersection->toPoint->y); +} + +void stage34PrintTowers(tower_t *tower, FILE *outputFile, double diameter) { + fprintf(outputFile, "Watchtower ID: %s, Postcode: %s, Population " \ + "Served: %d, Watchtower Point of Contact Name: %s, x: %lf, y: %lf, " \ + "Diameter of Cell: %lf\n", tower->id, tower->postcode, \ + tower->population, tower->manager, tower->x, tower->y, diameter); +} + +int getFaceTowerIsIn(DCEL_t *dcel, tower_t *tower) { + for (int i = 0; i < getFaceCount(dcel); i++) { + if (inFace(dcel, tower->x, tower->y, i)) { + return i; + } + } + return -1; +} + +void incrementalVoronoi(DCEL_t *voronoi, tower_t *tower) { + int faceTowerIsIn = getFaceTowerIsIn(voronoi, tower); + if (faceTowerIsIn == -1) { + fprintf(stderr, "Error: Watchtower %s is outside the polygon.\n", \ + tower->id); + exit(EXIT_FAILURE); + } +} + +DCEL_t *newVoronoi(DCEL_t *voronoi, tower_t *towerA, tower_t *towerB) { + /* Get vertices from towers */ + vertex_t *pointA = getAPoint(towerA->x, towerA->y); + vertex_t *pointB = getAPoint(towerB->x, towerB->y); + + /* Create first bisector */ + bisector_t *bisector = newBisector(); + bisector = getABisector(bisector, pointA, pointB); + + /* Get intersection of bisector with the polygon */ + intersection_t *intersection = NULL; + intersection = getAnIntersection(intersection, voronoi, bisector, \ + DEFAULT_FACE, DEFAULTMINLENGTH); + + if (intersection) { + free(intersection->fromPoint); + free(intersection->toPoint); + free(intersection); + } + + free(bisector->mid); + free(bisector); + free(pointA); + free(pointB); + return voronoi; +} + +void stage1(char *pointsFileName, char *outputFileName) { + FILE *pointsFile = NULL, *outputFile = NULL; + pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + /* Points are given as pairs, so initialise 2 points */ + vertex_t **points = malloc(sizeof(*points) * 2); + checkNullPointer(points); + int numPoints = 0; + points = readPoints(points, pointsFile, &numPoints); + + /* There are half as many bisectors as points */ + int numBisectors = numPoints / 2; + bisector_t **bisectors = malloc(sizeof(*bisectors) * numBisectors); + checkNullPointer(bisectors); + bisectors = getBisectors(bisectors, points, numBisectors); + + /* For each pair, calculate and print the bisector to outputFile */ + for (int i = 0; i < numBisectors; i++) { + stage1PrintBisector(bisectors[i], outputFile); + } + + /* Clean up */ + freePoints(points, numPoints); + freeBisectors(bisectors, numBisectors); + fclose(pointsFile); + fclose(outputFile); +} + +void stage2(char *pointsFileName, char *polygonFileName, \ + char *outputFileName) { + + FILE *pointsFile = NULL, *outputFile = NULL; + pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + /* Points are given as pairs, so initialise 2 points */ + vertex_t **points = malloc(sizeof(*points) * 2); + checkNullPointer(points); + int numPoints = 0; + points = readPoints(points, pointsFile, &numPoints); + + /* There are half as many bisectors as points */ + int numBisectors = numPoints / 2; + bisector_t **bisectors = malloc(sizeof(*bisectors) * numBisectors); + checkNullPointer(bisectors); + bisectors = getBisectors(bisectors, points, numBisectors); + + /* Construct the DCEL from the polygon file */ + DCEL_t *dcel = readPolygonFile(polygonFileName); + + /* Calculate and print intersections to the output file */ + intersection_t **intersections = malloc(sizeof(*intersections)); + checkNullPointer(intersections); + int numIntersections = 0; + intersections = getIntersections(intersections, &numIntersections, \ + bisectors, numBisectors, dcel, DEFAULT_FACE, DEFAULTMINLENGTH); + + for (int i = 0; i < numIntersections; i++) { + stage2PrintIntersection(intersections[i], outputFile); + } + + /* Clean up */ + freePoints(points, numPoints); + freeBisectors(bisectors, numBisectors); + freeIntersections(intersections, numIntersections); + freeDCEL(dcel); + fclose(pointsFile); + fclose(outputFile); +} + +void stage3(char *dataFileName, char *polygonFileName, char *outputFileName) { + FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; + dataFile = safeFileOpen(&dataFile, dataFileName, "r"); + polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + /* Read towers from the data file */ + tower_t **towers = malloc(sizeof(*towers)); + checkNullPointer(towers); + int numTowers = 0; + towers = readTowers(towers, dataFile, &numTowers); + + /* Construct the DCEL from the polygon file */ + DCEL_t *dcel = readPolygonFile(polygonFileName); + + /* Add each tower to the Voronoi DCEL */ + + /* Get diameters and output to outputFile */ + + /* Clean up */ + freeDCEL(dcel); + freeTowers(towers, numTowers); + fclose(dataFile); + fclose(polygonFile); + fclose(outputFile); +} + +void stage4(char *dataFileName, char *polygonFileName, char *outputFileName) { + FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; + dataFile = safeFileOpen(&dataFile, dataFileName, "r"); + polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + /* Read towers from the data file */ + tower_t **towers = malloc(sizeof(*towers)); + checkNullPointer(towers); + int numTowers = 0; + towers = readTowers(towers, dataFile, &numTowers); + + /* Construct the DCEL from the polygon file */ + DCEL_t *dcel = readPolygonFile(polygonFileName); + + /* Add each tower to the Voronoi DCEL */ + + /* Get diameters and sort, then output to outputFile */ + + /* Clean up */ + freeDCEL(dcel); + freeTowers(towers, numTowers); + fclose(dataFile); + fclose(polygonFile); + fclose(outputFile); +} diff --git a/voronoi.h b/src/voronoi.h similarity index 100% rename from voronoi.h rename to src/voronoi.h diff --git a/pp_horizontal.txt b/test/data/point-pairs/pp_horizontal.txt similarity index 94% rename from pp_horizontal.txt rename to test/data/point-pairs/pp_horizontal.txt index 6fd4837..26c210a 100644 --- a/pp_horizontal.txt +++ b/test/data/point-pairs/pp_horizontal.txt @@ -1,12 +1,12 @@ -1.0 1.0 2.0 1.0 -1.0 1.0 3.0 1.0 -1.0 1.0 4.0 1.0 -1.0 1.0 5.0 1.0 -0.0 1.0 1.0 1.0 -0.0 1.0 2.0 1.0 -0.0 1.0 3.0 1.0 -0.0 1.0 4.0 1.0 -0.0 2.0 4.0 2.0 -0.0 3.0 4.0 3.0 -0.0 4.0 4.0 4.0 +1.0 1.0 2.0 1.0 +1.0 1.0 3.0 1.0 +1.0 1.0 4.0 1.0 +1.0 1.0 5.0 1.0 +0.0 1.0 1.0 1.0 +0.0 1.0 2.0 1.0 +0.0 1.0 3.0 1.0 +0.0 1.0 4.0 1.0 +0.0 2.0 4.0 2.0 +0.0 3.0 4.0 3.0 +0.0 4.0 4.0 4.0 0.0 0.0 4.0 0.0 \ No newline at end of file diff --git a/pp_inside.txt b/test/data/point-pairs/pp_inside.txt similarity index 96% rename from pp_inside.txt rename to test/data/point-pairs/pp_inside.txt index 10e43fa..06009c5 100644 --- a/pp_inside.txt +++ b/test/data/point-pairs/pp_inside.txt @@ -1,6 +1,6 @@ -145.6 -34.2 145.6 -35.2 -145.6 -34.2 145.6 -36.2 -145.6 -35.2 148.6 -35.2 -147.6 -35.2 146.6 -35.2 -148.6 -35.2 146.6 -35.2 -148.6 -34.2 146.6 -32.2 +145.6 -34.2 145.6 -35.2 +145.6 -34.2 145.6 -36.2 +145.6 -35.2 148.6 -35.2 +147.6 -35.2 146.6 -35.2 +148.6 -35.2 146.6 -35.2 +148.6 -34.2 146.6 -32.2 diff --git a/pp_vertical.txt b/test/data/point-pairs/pp_vertical.txt similarity index 95% rename from pp_vertical.txt rename to test/data/point-pairs/pp_vertical.txt index 8b9cad1..f7dc50e 100644 --- a/pp_vertical.txt +++ b/test/data/point-pairs/pp_vertical.txt @@ -1,6 +1,6 @@ -0.0 0.0 0.0 1.0 -0.0 0.0 0.0 2.0 -0.0 1.0 0.0 2.0 -1.0 1.0 1.0 2.0 -2.0 1.0 2.0 2.0 +0.0 0.0 0.0 1.0 +0.0 0.0 0.0 2.0 +0.0 1.0 0.0 2.0 +1.0 1.0 1.0 2.0 +2.0 1.0 2.0 2.0 3.0 1.0 3.0 2.0 \ No newline at end of file diff --git a/polygon_irregular.txt b/test/data/polygons/polygon_irregular.txt similarity index 96% rename from polygon_irregular.txt rename to test/data/polygons/polygon_irregular.txt index 6c27e19..df1c497 100644 --- a/polygon_irregular.txt +++ b/test/data/polygons/polygon_irregular.txt @@ -1,8 +1,8 @@ -142.993000 -33.122900 -147.597600 -33.221400 -150.054600 -36.590100 -150.400400 -39.229900 -147.779600 -40.333100 -144.412600 -40.195200 -140.736200 -39.289000 +142.993000 -33.122900 +147.597600 -33.221400 +150.054600 -36.590100 +150.400400 -39.229900 +147.779600 -40.333100 +144.412600 -40.195200 +140.736200 -39.289000 140.335800 -37.476600 \ No newline at end of file diff --git a/polygon_square.txt b/test/data/polygons/polygon_square.txt similarity index 94% rename from polygon_square.txt rename to test/data/polygons/polygon_square.txt index fee9c6f..4e6cbce 100644 --- a/polygon_square.txt +++ b/test/data/polygons/polygon_square.txt @@ -1,4 +1,4 @@ -140.9 -39.2 -140.9 -33.9 -150.0 -33.9 +140.9 -39.2 +140.9 -33.9 +150.0 -33.9 150.0 -39.2 \ No newline at end of file diff --git a/dataset_1.csv b/test/data/watchtowers/dataset_1.csv similarity index 100% rename from dataset_1.csv rename to test/data/watchtowers/dataset_1.csv diff --git a/dataset_10.csv b/test/data/watchtowers/dataset_10.csv similarity index 98% rename from dataset_10.csv rename to test/data/watchtowers/dataset_10.csv index b12dbfe..5321ba4 100644 --- a/dataset_10.csv +++ b/test/data/watchtowers/dataset_10.csv @@ -1,11 +1,11 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 -WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 -WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 -WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 -WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 -WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 -WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 -WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 +WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 +WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 +WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 +WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 +WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 diff --git a/dataset_100.csv b/test/data/watchtowers/dataset_100.csv similarity index 98% rename from dataset_100.csv rename to test/data/watchtowers/dataset_100.csv index 49cf088..f6d12b5 100644 --- a/dataset_100.csv +++ b/test/data/watchtowers/dataset_100.csv @@ -1,101 +1,101 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3023QBQJF,3023,12794,Sandra Jaynes,144.7116868675065,-37.79835253004884 -WT3037YAKEI,3037,25577,Paul Watson,144.7404381965215,-37.71057606210163 -WT3810RRMDP,3810,47894,Shirl Bays,145.54377380709113,-38.11642115246884 -WT3550ANADF,3550,10084,Virginia Lumpkins,144.25225555806287,-36.7583657822827 -WT3754SXJZI,3754,6292,Henriette Mitchell,145.1619799395555,-37.61057382984485 -WT3754WSOKP,3754,6292,James Lopez,145.11378037030943,-37.60927638542337 -WT3046ADKBS,3046,8515,Morris Pring,144.94317380188164,-37.71659755462475 -WT3178BQAJG,3178,5612,Malka Smith,145.26959423333145,-37.918875236595035 -WT3130PLSQY,3130,8043,Jose Hayes,145.13764760079675,-37.828083908584475 -WT3032PWVMB,3032,7362,William Mackiewicz,144.87559681642185,-37.79083145310446 -WT3173JKIEY,3173,5157,Teddy Mccauley,145.18948448769126,-37.992844271467284 -WT3122GVRSM,3122,11755,William Bell,145.0366394627393,-37.810997917513916 -WT3171BGAEJ,3171,7238,Lila Levy,145.1337946019459,-37.92898751855743 -WT3128AQDRS,3128,6609,Sarah Kauffman,145.1295813912443,-37.82078823368618 -WT3219MZCMM,3219,4928,Charlie Gerber,144.37942394090373,-38.19362930153523 -WT3170XJVWP,3170,9684,Lucy Lahay,145.17553159514887,-37.936150181976984 -WT3031DMFGC,3031,6177,Caroline Luckenbach,144.90707048527796,-37.78767901585732 -WT3015PKLER,3015,8736,Bill Kilbane,144.8979183219914,-37.82580808335247 -WT3106WQFPR,3106,2374,Mary Bass,145.14274097499288,-37.731835101044354 -WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 -WT3352KHBBN,3352,15996,Richard Askew,143.60419898610786,-37.722432808576656 -WT3079QORWG,3079,5329,Jerry Somogyi,145.05361972090736,-37.76092644646485 -WT3850WPPZJ,3850,14779,Scott Buggie,146.99670975934802,-38.11120375121315 -WT3400BOZRI,3400,14543,Tom Davis,142.2056868163526,-36.700923449995635 -WT3123YZTIF,3123,7160,Paul Earwood,145.05955004240124,-37.82771644759941 -WT3224OGJJN,3224,1773,Shirley Hall,144.42849521054393,-38.218027859101916 -WT3137PJCVG,3137,1541,Yolanda Stern,145.32887887734955,-37.830025027117365 -WT3305NMFYC,3305,3204,Larry Witter,141.29643421841453,-38.11167114301085 -WT3305KWOFD,3305,3204,Judith Figueroa,141.25644777166127,-38.24079323443777 -WT3025UXSIE,3025,2430,Willie Laigo,144.79429337101448,-37.82881778367748 -WT3437KHBPL,3437,3479,Charlotte Green,144.59696365066134,-37.48113208398435 -WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 -WT3019ASCJP,3019,3065,Charlotte Coutermarsh,144.85492421197495,-37.772589492919515 -WT3019JIKGX,3019,3065,Vincent January,144.85730316799982,-37.7718018219131 -WT3764MKCUE,3764,4582,Alejandrina Salazar,144.970506104261,-37.15854276662507 -WT3730UTUPX,3730,2944,Curtis Johnson,145.8390200963087,-36.01276678240247 -WT3054SQEQA,3054,8428,Eugene Salano,144.95861592679725,-37.783412869711185 -WT3620DPAMB,3620,4120,Ben Oneil,144.96824098896346,-36.398921729744224 -WT3804OQOOF,3804,2023,Jackie Smith,145.35298253700518,-37.98426462189473 -WT3909HFRJQ,3909,2633,Maria Rhodus,147.90601975805444,-37.764598529015366 -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3953NPQQN,3953,1571,Peter Willer,146.04193592469497,-38.44633595871089 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 -WT3027FZKQC,3027,3323,Angelo Hard,144.73167189283603,-37.85646049026309 -WT3996ZMYGL,3996,1846,Jennifer Adkins,145.7771574897382,-38.67107249698782 -WT3984UBSFJ,3984,1041,Ned Johnson,145.61381415852048,-38.3660140349184 -WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 -WT3950WWFHI,3950,2400,Donald Neil,145.789697571232,-38.44829776894874 -WT3842LLUAZ,3842,2391,Justin Butcher,146.43738290720543,-38.33409319136186 -WT3225ZWRKT,3225,1352,Sierra Zelaya,144.63248453729392,-38.273920927385454 -WT3797JXEYZ,3797,1738,Wade Seay,145.59525777895735,-37.85187937890587 -WT3980CXZJX,3980,1675,Marianne Gulledge,145.38407991603268,-38.234540388656654 -WT3862WPONG,3862,1578,Anthony Dawkins,147.33271058732282,-37.491238739170896 -WT3202IDOPR,3202,1453,Shannon Bello,145.07561474247163,-37.947828524869706 -WT3304LTOER,3304,681,James Broadway,141.91304296053238,-38.08286392590754 -WT3478NOSNX,3478,614,Mary Wooster,143.190083774406,-36.70864776402552 -WT3373ZJBZG,3373,573,Helen Hu,143.40004730403342,-37.327257624451846 -WT3373FDEUM,3373,573,Phyllis Hegyi,143.19424925274458,-37.38771716562931 -WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 -WT3673HXZDV,3673,346,June Matteson,145.99560167654946,-36.51826050506983 -WT3943FFEHH,3943,398,Floyd Mcfaul,144.7219219690698,-38.32665967904324 -WT3937YBAGH,3937,762,Tyesha Evans,145.0385876851752,-38.37262744294901 -WT3786QKGRU,3786,506,Joe Pulaski,145.33261178176102,-37.876147897332174 -WT3321FSNXX,3321,759,James Mcintosh,144.00220559674338,-38.10453080180178 -WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 -WT3231VKTTU,3231,418,Karl Evans,143.99174248566703,-38.47241568127852 -WT3231YSKOO,3231,418,Leontine Mcghee,144.07128861030645,-38.416049306559025 -WT3766LYICC,3766,619,Gary Evans,145.3953639008541,-37.81880414343826 -WT3381FUDIA,3381,151,Penny Carrier,142.7602629758581,-37.02897861269415 -WT3232GSLYH,3232,1114,Joshua Sickafoose,143.96111969797116,-38.544885004427805 -WT3933UXXXP,3933,549,Shaun Guffey,145.11706009902144,-38.26228415412558 -WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 -WT3701TPSEH,3701,269,Grant Kennedy,147.41241338695838,-36.74234154193107 -WT3312BCEJQ,3312,1031,Alexandra Ratzlaff,141.38649875710092,-37.85213620536482 -WT3332VSYVL,3332,338,Charles Koons,144.08742265383532,-37.906318691909874 -WT3623CXKIC,3623,224,Rebecca Lara,144.90863570166192,-36.44103547317975 -WT3289ZSWDS,3289,378,Kim Hall,142.1760506248015,-37.83343114690931 -WT3728YZARW,3728,318,Heather Cummings,145.8168813215635,-36.115027477064245 -WT3633WGRXB,3633,201,John Miller,145.48023893751045,-36.2875408553956 -WT3633UVHAO,3633,201,Michael Price,145.51505172180683,-36.31027112244356 -WT3637KIERO,3637,198,Robert Dow,145.25553090556156,-36.0980796504903 -WT3063WZIQE,3063,114,James Miller,144.81061694155076,-37.553501843305575 -WT3334GGKOS,3334,141,Elizabet Benson,144.1621690362788,-37.67891238372265 -WT3251FUJSG,3251,522,Lisa Voegele,143.5797389397756,-38.1623931117428 -WT3649NJHAF,3649,86,Catherine Ortiz,145.70444412227315,-36.12591041370753 -WT3287NEKVB,3287,216,Joel Simmons,142.26305043381535,-37.983480961999916 -WT3407PYOAR,3407,420,Gale Martin,141.83324586447986,-37.2859635851256 -WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 -WT3719TVVJM,3719,122,Brent Bautista,145.6864773045679,-37.03188286944955 -WT3719HLABD,3719,122,Alfred Too,145.52985920519603,-36.964844896202216 -WT3573DPVGU,3573,111,Wiley Palmer,144.15009214850954,-36.12318035418112 -WT3254RXAVL,3254,310,Amy Pugh,143.54387071993327,-38.308515316326016 -WT3832NHOOV,3832,247,Bryan Warren,146.0154412945935,-37.93424551655733 -WT3238BOTYW,3238,72,Bernard Jackson,143.567776369521,-38.625836774939955 -WT3238MCUPV,3238,72,Nellie Banks,143.56196753560545,-38.82942446565583 -WT3375LAJLR,3375,104,Emma Boatwright,143.2980117885972,-37.372200644973155 -WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 -WT3596HBEUF,3596,47,Jose Robertson,143.15095468769667,-35.190473662123345 -WT3293SQKBY,3293,100,Shawn Clark,142.64808203542347,-37.82556647618436 -WT3887NLNSJ,3887,342,Lorene Anderson,147.96080438424718,-37.76269836557282 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3023QBQJF,3023,12794,Sandra Jaynes,144.7116868675065,-37.79835253004884 +WT3037YAKEI,3037,25577,Paul Watson,144.7404381965215,-37.71057606210163 +WT3810RRMDP,3810,47894,Shirl Bays,145.54377380709113,-38.11642115246884 +WT3550ANADF,3550,10084,Virginia Lumpkins,144.25225555806287,-36.7583657822827 +WT3754SXJZI,3754,6292,Henriette Mitchell,145.1619799395555,-37.61057382984485 +WT3754WSOKP,3754,6292,James Lopez,145.11378037030943,-37.60927638542337 +WT3046ADKBS,3046,8515,Morris Pring,144.94317380188164,-37.71659755462475 +WT3178BQAJG,3178,5612,Malka Smith,145.26959423333145,-37.918875236595035 +WT3130PLSQY,3130,8043,Jose Hayes,145.13764760079675,-37.828083908584475 +WT3032PWVMB,3032,7362,William Mackiewicz,144.87559681642185,-37.79083145310446 +WT3173JKIEY,3173,5157,Teddy Mccauley,145.18948448769126,-37.992844271467284 +WT3122GVRSM,3122,11755,William Bell,145.0366394627393,-37.810997917513916 +WT3171BGAEJ,3171,7238,Lila Levy,145.1337946019459,-37.92898751855743 +WT3128AQDRS,3128,6609,Sarah Kauffman,145.1295813912443,-37.82078823368618 +WT3219MZCMM,3219,4928,Charlie Gerber,144.37942394090373,-38.19362930153523 +WT3170XJVWP,3170,9684,Lucy Lahay,145.17553159514887,-37.936150181976984 +WT3031DMFGC,3031,6177,Caroline Luckenbach,144.90707048527796,-37.78767901585732 +WT3015PKLER,3015,8736,Bill Kilbane,144.8979183219914,-37.82580808335247 +WT3106WQFPR,3106,2374,Mary Bass,145.14274097499288,-37.731835101044354 +WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 +WT3352KHBBN,3352,15996,Richard Askew,143.60419898610786,-37.722432808576656 +WT3079QORWG,3079,5329,Jerry Somogyi,145.05361972090736,-37.76092644646485 +WT3850WPPZJ,3850,14779,Scott Buggie,146.99670975934802,-38.11120375121315 +WT3400BOZRI,3400,14543,Tom Davis,142.2056868163526,-36.700923449995635 +WT3123YZTIF,3123,7160,Paul Earwood,145.05955004240124,-37.82771644759941 +WT3224OGJJN,3224,1773,Shirley Hall,144.42849521054393,-38.218027859101916 +WT3137PJCVG,3137,1541,Yolanda Stern,145.32887887734955,-37.830025027117365 +WT3305NMFYC,3305,3204,Larry Witter,141.29643421841453,-38.11167114301085 +WT3305KWOFD,3305,3204,Judith Figueroa,141.25644777166127,-38.24079323443777 +WT3025UXSIE,3025,2430,Willie Laigo,144.79429337101448,-37.82881778367748 +WT3437KHBPL,3437,3479,Charlotte Green,144.59696365066134,-37.48113208398435 +WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 +WT3019ASCJP,3019,3065,Charlotte Coutermarsh,144.85492421197495,-37.772589492919515 +WT3019JIKGX,3019,3065,Vincent January,144.85730316799982,-37.7718018219131 +WT3764MKCUE,3764,4582,Alejandrina Salazar,144.970506104261,-37.15854276662507 +WT3730UTUPX,3730,2944,Curtis Johnson,145.8390200963087,-36.01276678240247 +WT3054SQEQA,3054,8428,Eugene Salano,144.95861592679725,-37.783412869711185 +WT3620DPAMB,3620,4120,Ben Oneil,144.96824098896346,-36.398921729744224 +WT3804OQOOF,3804,2023,Jackie Smith,145.35298253700518,-37.98426462189473 +WT3909HFRJQ,3909,2633,Maria Rhodus,147.90601975805444,-37.764598529015366 +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3953NPQQN,3953,1571,Peter Willer,146.04193592469497,-38.44633595871089 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3027FZKQC,3027,3323,Angelo Hard,144.73167189283603,-37.85646049026309 +WT3996ZMYGL,3996,1846,Jennifer Adkins,145.7771574897382,-38.67107249698782 +WT3984UBSFJ,3984,1041,Ned Johnson,145.61381415852048,-38.3660140349184 +WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 +WT3950WWFHI,3950,2400,Donald Neil,145.789697571232,-38.44829776894874 +WT3842LLUAZ,3842,2391,Justin Butcher,146.43738290720543,-38.33409319136186 +WT3225ZWRKT,3225,1352,Sierra Zelaya,144.63248453729392,-38.273920927385454 +WT3797JXEYZ,3797,1738,Wade Seay,145.59525777895735,-37.85187937890587 +WT3980CXZJX,3980,1675,Marianne Gulledge,145.38407991603268,-38.234540388656654 +WT3862WPONG,3862,1578,Anthony Dawkins,147.33271058732282,-37.491238739170896 +WT3202IDOPR,3202,1453,Shannon Bello,145.07561474247163,-37.947828524869706 +WT3304LTOER,3304,681,James Broadway,141.91304296053238,-38.08286392590754 +WT3478NOSNX,3478,614,Mary Wooster,143.190083774406,-36.70864776402552 +WT3373ZJBZG,3373,573,Helen Hu,143.40004730403342,-37.327257624451846 +WT3373FDEUM,3373,573,Phyllis Hegyi,143.19424925274458,-37.38771716562931 +WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 +WT3673HXZDV,3673,346,June Matteson,145.99560167654946,-36.51826050506983 +WT3943FFEHH,3943,398,Floyd Mcfaul,144.7219219690698,-38.32665967904324 +WT3937YBAGH,3937,762,Tyesha Evans,145.0385876851752,-38.37262744294901 +WT3786QKGRU,3786,506,Joe Pulaski,145.33261178176102,-37.876147897332174 +WT3321FSNXX,3321,759,James Mcintosh,144.00220559674338,-38.10453080180178 +WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 +WT3231VKTTU,3231,418,Karl Evans,143.99174248566703,-38.47241568127852 +WT3231YSKOO,3231,418,Leontine Mcghee,144.07128861030645,-38.416049306559025 +WT3766LYICC,3766,619,Gary Evans,145.3953639008541,-37.81880414343826 +WT3381FUDIA,3381,151,Penny Carrier,142.7602629758581,-37.02897861269415 +WT3232GSLYH,3232,1114,Joshua Sickafoose,143.96111969797116,-38.544885004427805 +WT3933UXXXP,3933,549,Shaun Guffey,145.11706009902144,-38.26228415412558 +WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 +WT3701TPSEH,3701,269,Grant Kennedy,147.41241338695838,-36.74234154193107 +WT3312BCEJQ,3312,1031,Alexandra Ratzlaff,141.38649875710092,-37.85213620536482 +WT3332VSYVL,3332,338,Charles Koons,144.08742265383532,-37.906318691909874 +WT3623CXKIC,3623,224,Rebecca Lara,144.90863570166192,-36.44103547317975 +WT3289ZSWDS,3289,378,Kim Hall,142.1760506248015,-37.83343114690931 +WT3728YZARW,3728,318,Heather Cummings,145.8168813215635,-36.115027477064245 +WT3633WGRXB,3633,201,John Miller,145.48023893751045,-36.2875408553956 +WT3633UVHAO,3633,201,Michael Price,145.51505172180683,-36.31027112244356 +WT3637KIERO,3637,198,Robert Dow,145.25553090556156,-36.0980796504903 +WT3063WZIQE,3063,114,James Miller,144.81061694155076,-37.553501843305575 +WT3334GGKOS,3334,141,Elizabet Benson,144.1621690362788,-37.67891238372265 +WT3251FUJSG,3251,522,Lisa Voegele,143.5797389397756,-38.1623931117428 +WT3649NJHAF,3649,86,Catherine Ortiz,145.70444412227315,-36.12591041370753 +WT3287NEKVB,3287,216,Joel Simmons,142.26305043381535,-37.983480961999916 +WT3407PYOAR,3407,420,Gale Martin,141.83324586447986,-37.2859635851256 +WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 +WT3719TVVJM,3719,122,Brent Bautista,145.6864773045679,-37.03188286944955 +WT3719HLABD,3719,122,Alfred Too,145.52985920519603,-36.964844896202216 +WT3573DPVGU,3573,111,Wiley Palmer,144.15009214850954,-36.12318035418112 +WT3254RXAVL,3254,310,Amy Pugh,143.54387071993327,-38.308515316326016 +WT3832NHOOV,3832,247,Bryan Warren,146.0154412945935,-37.93424551655733 +WT3238BOTYW,3238,72,Bernard Jackson,143.567776369521,-38.625836774939955 +WT3238MCUPV,3238,72,Nellie Banks,143.56196753560545,-38.82942446565583 +WT3375LAJLR,3375,104,Emma Boatwright,143.2980117885972,-37.372200644973155 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +WT3596HBEUF,3596,47,Jose Robertson,143.15095468769667,-35.190473662123345 +WT3293SQKBY,3293,100,Shawn Clark,142.64808203542347,-37.82556647618436 +WT3887NLNSJ,3887,342,Lorene Anderson,147.96080438424718,-37.76269836557282 diff --git a/dataset_2.csv b/test/data/watchtowers/dataset_2.csv similarity index 98% rename from dataset_2.csv rename to test/data/watchtowers/dataset_2.csv index a6dcf1e..c740811 100644 --- a/dataset_2.csv +++ b/test/data/watchtowers/dataset_2.csv @@ -1,3 +1,3 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 diff --git a/dataset_3.csv b/test/data/watchtowers/dataset_3.csv similarity index 98% rename from dataset_3.csv rename to test/data/watchtowers/dataset_3.csv index 85afa0f..f8905da 100644 --- a/dataset_3.csv +++ b/test/data/watchtowers/dataset_3.csv @@ -1,4 +1,4 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 -WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 diff --git a/dataset_4.csv b/test/data/watchtowers/dataset_4.csv similarity index 98% rename from dataset_4.csv rename to test/data/watchtowers/dataset_4.csv index 58b207a..668fe24 100644 --- a/dataset_4.csv +++ b/test/data/watchtowers/dataset_4.csv @@ -1,5 +1,5 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 -WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 -WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 diff --git a/dataset_full.csv b/test/data/watchtowers/dataset_full.csv similarity index 98% rename from dataset_full.csv rename to test/data/watchtowers/dataset_full.csv index 81453f7..b54e23f 100644 --- a/dataset_full.csv +++ b/test/data/watchtowers/dataset_full.csv @@ -1,1081 +1,1081 @@ -Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y -WT3030WFXSP,3030,16718,Adam Guess,144.6583806266531,-37.920393458737394 -WT3030EAAIV,3030,16718,Kristi Blair,144.6243406879087,-37.91670989311453 -WT3030CEWEY,3030,16718,Trina Smith,144.52820347883215,-37.9093277995756 -WT3030JVCEB,3030,16718,Louis Johnston,144.45024112491487,-37.98394994940138 -WT3030YFNAG,3030,16718,Corey Johnson,144.70361542108188,-37.92472052154974 -WT3030LTIGF,3030,16718,Rose Doyle,144.46278815338627,-38.00911872735974 -WT3029SXHHE,3029,31316,Linda Iversen,144.71296675156486,-37.86520821798988 -WT3029WTVUC,3029,31316,Betty Kinkead,144.65575178193805,-37.85023341318659 -WT3029FPTUC,3029,31316,Linda Holmes,144.64896347497066,-37.80533290563009 -WT3977GQKCK,3977,46663,Elbert Gonzalez,145.25331943044847,-38.113610331211525 -WT3977EDZMT,3977,46663,Jared Mini,145.20203781339058,-38.11829293213807 -WT3064ZSYLE,3064,75457,Andres Hinerman,144.99937422807804,-37.529604814092735 -WT3023FWWDF,3023,12794,Bruce Shelton,144.78739771947542,-37.717817040670845 -WT3023UPTGH,3023,12794,Audrey Pottinger,144.73156254752686,-37.74093124005147 -WT3023MTCLY,3023,12794,Karri Daniel,144.75885721627395,-37.79319127956608 -WT3023QBQJF,3023,12794,Sandra Jaynes,144.7116868675065,-37.79835253004884 -WT3023SNBCZ,3023,12794,Harold Street,144.74109283367372,-37.7770166374208 -WT3150RJFPF,3150,60079,Charles Mayhew,145.15558074332156,-37.880884421156225 -WT3350NKSMB,3350,59145,Robert Walker,143.79635297547784,-37.53085956944499 -WT3805LNWZK,3805,56933,Al Howard,145.32997457936534,-38.02904884185844 -WT3216YAONQ,3216,9380,Mamie Isenberg,144.3574810402222,-38.18212005541767 -WT3216RRLQT,3216,9380,Lucia Nesbit,144.26515487987933,-38.19543768887932 -WT3216JMHUR,3216,9380,Brian Funderburk,144.36188022322395,-38.18996650227888 -WT3216XCZZB,3216,9380,Joseph Fitzgerald,144.32820084704858,-38.18360092582498 -WT3216DJFMH,3216,9380,Carole Ines,144.2756956328754,-38.21314829043297 -WT3216KCMJI,3216,9380,Edward Kirby,144.35398948209195,-38.194825198185804 -WT3199YCAXG,3199,54298,Karolyn Powers,145.12150620883324,-38.14922616931948 -WT3021GOWCI,3021,10838,David Kinkelaar,144.80893593008622,-37.76038864241594 -WT3021WLVBY,3021,10838,Grace Delisio,144.76656834121744,-37.74757159362882 -WT3021ZDXUT,3021,10838,Joel Koppenhaver,144.79009590439128,-37.75656051246632 -WT3021ETLPZ,3021,10838,Bessie Britton,144.82137301024244,-37.76070759665212 -WT3021NRDYD,3021,10838,Michael Ford,144.7744197768088,-37.72333341047645 -WT3175IPFYN,3175,17765,Thomas Arrington,145.225146895528,-38.022615341752626 -WT3175NTSYH,3175,17765,Howard Hall,145.16065666389912,-38.05647092673088 -WT3175FGGWD,3175,17765,Pamela Arch,145.17941408411815,-38.07927410144703 -WT3037YAKEI,3037,25577,Paul Watson,144.7404381965215,-37.71057606210163 -WT3037PDFYE,3037,25577,Kirk Wells,144.7531908939604,-37.67923545314725 -WT3073SJWMD,3073,12618,Eric Brinton,145.00498806225505,-37.69072253860459 -WT3073KMHND,3073,12618,Cheryl Johnson,145.00457802784703,-37.702736125755365 -WT3073ONYMR,3073,12618,Mike Torres,145.00628991909576,-37.711935332631434 -WT3073PYIIS,3073,12618,Christina Drumheller,145.0391077826588,-37.722743246616815 -WT3806QYESS,3806,8086,James Escobar,145.3317722219415,-37.97440088154117 -WT3806FONGK,3806,8086,Mae Westlie,145.3474579996713,-37.99807732281171 -WT3806ZXAFC,3806,8086,Anthony Sanders,145.31703178391476,-38.043913751358616 -WT3806RWKRS,3806,8086,Helen Harris,145.38696767754786,-38.01640678680775 -WT3806RCRBI,3806,8086,Ronald Clark,145.32693996891396,-38.03540190423143 -WT3806CGOWL,3806,8086,Marx Weiner,145.3853509640092,-38.016276081953485 -WT3810RRMDP,3810,47894,Shirl Bays,145.54377380709113,-38.11642115246884 -WT3020YBMJJ,3020,14927,David Romero,144.81308271981888,-37.78017960084323 -WT3020TBHAH,3020,14927,Mark Moore,144.80793220831066,-37.78665609588704 -WT3020IKMGC,3020,14927,Zula Nagy,144.85181759620312,-37.8113734834473 -WT3136XMORO,3136,14789,Jennifer Annis,145.2610489901307,-37.776402809772044 -WT3136JFBGP,3136,14789,Luis Lawson,145.30362087169183,-37.81142513832987 -WT3136OPSQS,3136,14789,Harriett Bunch,145.25652650583658,-37.78338733774677 -WT3550MNEUC,3550,10084,Aaron Timberlake,144.34548014895424,-36.76077323665997 -WT3550WPDGF,3550,10084,Frank Hall,144.3052352950293,-36.748338469985555 -WT3550ANADF,3550,10084,Virginia Lumpkins,144.25225555806287,-36.7583657822827 -WT3550ZOAVN,3550,10084,Melinda Longoria,144.31154158895455,-36.76339563696199 -WT3174QCCPN,3174,12820,Douglas Henley,145.18170096492744,-37.962463453868814 -WT3174SVLFP,3174,12820,Linda Pena,145.19975492357466,-37.97228515371461 -WT3174RTNEX,3174,12820,Marina King,145.19624744732596,-37.94599511222388 -WT3000MGKPJ,3000,18987,Otilia Rykaczewski,144.96171181726967,-37.82148358923285 -WT3000EYYYK,3000,18987,Peter Wheeler,144.9527711985453,-37.82383328788954 -WT3754SXJZI,3754,6292,Henriette Mitchell,145.1619799395555,-37.61057382984485 -WT3754BUNNX,3754,6292,Evelyn Moore,145.1818713827351,-37.569227768847064 -WT3754XKPJP,3754,6292,Leslie Bankston,145.06810561924175,-37.57939619269055 -WT3754DQUSN,3754,6292,Ella Rohrbacher,145.12640802729558,-37.61134953804294 -WT3754YEIRW,3754,6292,Michael Etienne,145.15550588910898,-37.565289543896235 -WT3754WSOKP,3754,6292,James Lopez,145.11378037030943,-37.60927638542337 -WT3156TLXBQ,3156,9366,Rita Singh,145.24765774213373,-37.91617846922139 -WT3156OVCXT,3156,9366,Amy Fisk,145.32200244441637,-37.90336764103624 -WT3156RMYYL,3156,9366,Mark Fernandez,145.2752824080853,-37.94563359375401 -WT3156ALZRL,3156,9366,Michelle Belk,145.2691830096965,-37.946946186713696 -WT3337ZQWGM,3337,36454,Casey Dalton,144.57009093872702,-37.64370381639777 -WT3429TMHZA,3429,6049,Anna Whitley,144.70767809089992,-37.59240449257921 -WT3429AKNKO,3429,6049,Wilbur Jones,144.82859912168232,-37.484572146701964 -WT3429QUOWL,3429,6049,George White,144.70116224426192,-37.58845771833162 -WT3429OIZPS,3429,6049,Michele Mitchell,144.73405343608528,-37.535127404228675 -WT3429FPUNU,3429,6049,Jeffrey Cuevas,144.78894841217732,-37.53575805856136 -WT3429ATTSU,3429,6049,Tony Rivera,144.8264180662807,-37.53104587054532 -WT3195IOEZA,3195,35869,Hazel Seal,145.0986312566308,-38.02519988348862 -WT3046TSZCB,3046,8515,Bryan Lewis,144.95822883047236,-37.72143208152169 -WT3046SSWEX,3046,8515,Claudia Johnson,144.93901814946574,-37.71113556434513 -WT3046QLKKF,3046,8515,Brett Hughes,144.95775841721363,-37.69521413198007 -WT3046ADKBS,3046,8515,Morris Pring,144.94317380188164,-37.71659755462475 -WT3058GAJIA,3058,11259,Lillian Williams,144.95509539103062,-37.72267717416843 -WT3058QBBEK,3058,11259,Lisa Silas,144.94771633746444,-37.72431868999582 -WT3058PMYON,3058,11259,John Orlikowski,144.96606832748174,-37.72489184577246 -WT3178DBGVI,3178,5612,Mary Woody,145.24027653682384,-37.93036802368387 -WT3178ZDEXK,3178,5612,Jeffrey Johnson,145.24988561798148,-37.92452579106426 -WT3178MNYBC,3178,5612,Timothy Padilla,145.27689800066636,-37.93760826019328 -WT3178KYQIS,3178,5612,George Langley,145.22989301524538,-37.90629276174462 -WT3178XTNBB,3178,5612,Olga Hale,145.2469458149325,-37.93319171214341 -WT3178BQAJG,3178,5612,Malka Smith,145.26959423333145,-37.918875236595035 -WT3149NUQMB,3149,11203,Mary Finley,145.11936237866772,-37.85849697750271 -WT3149SEGNE,3149,11203,Cherry Winstead,145.11714700908936,-37.879722955287434 -WT3149HQJPC,3149,11203,Nancy Newton,145.12340500068873,-37.88715970761158 -WT3690NYJLB,3690,5586,Adam Peacock,146.82345449162182,-36.09577537757103 -WT3690PQEQB,3690,5586,Richard Lewis,146.8008583711887,-36.06452725826131 -WT3690FWDEV,3690,5586,Robin Hartman,146.8345476029173,-36.16246966437017 -WT3690HZOLB,3690,5586,Willie Ibarra,146.83811326729935,-36.11657609054598 -WT3690VPZWP,3690,5586,Rick Spencer,146.81201011941323,-36.12471235728671 -WT3690XHHWT,3690,5586,Susan Goggin,146.88088411123238,-36.10317012808323 -WT3152USNWQ,3152,6618,Amber Hedin,145.22798311126752,-37.85324308519963 -WT3152NPPZC,3152,6618,Mildred Farry,145.19975611484864,-37.85062021145897 -WT3152AZNOY,3152,6618,Chong Chavez,145.21497655123054,-37.853348755217 -WT3152TQIAV,3152,6618,Harold Baron,145.1947729959802,-37.877961397530655 -WT3152FHNAO,3152,6618,Craig Sloan,145.25361925996987,-37.841104574320354 -WT3072RYLDO,3072,32851,Alexandria Porter,144.99431436418755,-37.738832144703785 -WT3134DTGBI,3134,6556,Allen Sheppard,145.2209379447918,-37.76787170771994 -WT3134JYPDI,3134,6556,Virgil Thomas,145.23608291476037,-37.81778079602793 -WT3134VAQRO,3134,6556,Chase Scott,145.21359856304974,-37.82689973086141 -WT3134NJHRS,3134,6556,Odessa Eplin,145.23314454629315,-37.79085183503013 -WT3134ZAWJS,3134,6556,Elijah Becker,145.22317215067378,-37.8064861673859 -WT3500WTTCL,3500,8184,Lori Greene,142.07369486414845,-34.1840939123636 -WT3076LVYFZ,3076,32395,Larry Menke,144.96542377017286,-37.64660543487833 -WT3130PLSQY,3130,8043,Jose Hayes,145.13764760079675,-37.828083908584475 -WT3130XMUNW,3130,8043,Cathy Powell,145.13454854622512,-37.814071594790974 -WT3130RXPQD,3130,8043,Lonnie Morgan,145.14993924759943,-37.803878744622146 -WT3130MLSKB,3130,8043,Jeanine Roberts,145.15758764500598,-37.83700562668973 -WT3280BGQFC,3280,7892,Christina Myers,142.5124079508843,-38.34652485601869 -WT3280ZNNGF,3280,7892,Dorine Taylor,142.54128128335316,-38.324696399460194 -WT3280ICHQC,3280,7892,Daniel Holt,142.47256138869804,-38.37493706098152 -WT3280GVPRD,3280,7892,Rebecca Robinson,142.47231992282983,-38.374726991411244 -WT3083VQQFF,3083,31526,Michael Kelsheimer,145.02432389049392,-37.71154012686286 -WT3630PRZEM,3630,10424,Marguerite Gibson,145.64651785281362,-36.52494634109052 -WT3630FANLS,3630,10424,Christopher Pate,145.63490206002706,-36.40980123195501 -WT3630SIKVF,3630,10424,Cecilia Pipes,145.67020940336758,-36.38181728988258 -WT3551OSDGB,3551,5913,Dario Miller,143.96122388612906,-36.661100832015194 -WT3551WUHGQ,3551,5913,Julia Harris,144.59869731863023,-36.71067973693701 -WT3551HZNZJ,3551,5913,Philip Whiteside,144.47967781227192,-36.72005122642794 -WT3551EWIYX,3551,5913,Jonathan Poindexter,143.7293498074458,-36.76605272468181 -WT3551WUGIW,3551,5913,Hans Miranda,144.53333375653355,-36.56455268072542 -WT3032GFFPO,3032,7362,Richard Walker,144.8861180004496,-37.78412012672793 -WT3032OQZEL,3032,7362,Nancy Ward,144.91934959363664,-37.76385385158951 -WT3032PNVIB,3032,7362,Allen Paulsen,144.8888607257873,-37.787185777191084 -WT3032PWVMB,3032,7362,William Mackiewicz,144.87559681642185,-37.79083145310446 -WT3028EVTUZ,3028,9733,Andrew Johnson,144.76292579701328,-37.89924217348946 -WT3028RFCNS,3028,9733,Billie Sterner,144.8044209591793,-37.84913098904796 -WT3028CNGER,3028,9733,Clara Lee,144.76379179481324,-37.867551798701946 -WT3844EDHDX,3844,28980,Tammy Mayweather,146.43714530130234,-38.3229284773084 -WT3109XTNYN,3109,14180,Raymond Bates,145.15909952410618,-37.80416922449334 -WT3109HXEBH,3109,14180,Wanda Johnson,145.1797356497215,-37.78398821626665 -WT3095OIJVG,3095,27771,Jessica Kubis,145.1727846073084,-37.69925086082626 -WT3038XJJWS,3038,9087,Darlene Anderson,144.79969082513048,-37.72359514749498 -WT3038BSCPT,3038,9087,Betty Claar,144.81011749261393,-37.71275294089123 -WT3038DWSIG,3038,9087,William Bona,144.77601184740396,-37.71809767361204 -WT3044ONLDH,3044,9038,Floyd Coffman,144.93310701680394,-37.735559167663965 -WT3044KLBHH,3044,9038,Rosemary Anthony,144.94253148988213,-37.74613640034775 -WT3044ADHAA,3044,9038,Harold Farnell,144.9442552666063,-37.73555900014787 -WT3040KJDIV,3040,6484,Barbara Venegas,144.91321985340645,-37.75720619865514 -WT3040TFPXX,3040,6484,Chris Spencer,144.89110381405945,-37.76065107159642 -WT3040IFXWW,3040,6484,Lynn Ibara,144.9268397283389,-37.74233613901868 -WT3040BUQSL,3040,6484,Wyatt Shaffer,144.9305577481481,-37.75505075155941 -WT3173PDSBH,3173,5157,Grace Owens,145.1944554691889,-38.021476076736825 -WT3173LSIEZ,3173,5157,Peggy Barb,145.14547021819877,-37.992158849544744 -WT3173VYMOK,3173,5157,Theresa Taylor,145.1894158199428,-38.00003695621938 -WT3173GFZOQ,3173,5157,Donald Lozano,145.19499865506185,-37.988541644587656 -WT3173JKIEY,3173,5157,Teddy Mccauley,145.18948448769126,-37.992844271467284 -WT3084JROEH,3084,12758,Sarah Lerma,145.07262197475765,-37.750857556422204 -WT3084GWBWX,3084,12758,Sean Magruder,145.08417155444224,-37.734350005293706 -WT3196XSNIF,3196,8442,Tamika Hardy,145.11969767221726,-38.05403074423008 -WT3196IBOKA,3196,8442,Warren Morales,145.14133411912982,-38.030989105994266 -WT3196YBQPJ,3196,8442,Louise Hassan,145.11328140987263,-38.0694853367573 -WT3146HRIZE,3146,25255,Manuel Ingham,145.05369626641567,-37.85103460177614 -WT3141NAWKR,3141,4191,Byron Hutchins,144.98666929059277,-37.84030215496492 -WT3141VUIEX,3141,4191,Mario Degeorge,144.99084667596154,-37.83266855015864 -WT3141XWIRO,3141,4191,Gladys Wicks,144.9903037073295,-37.829036050601765 -WT3141DNRAR,3141,4191,Christopher Gladden,145.00656224560973,-37.83749211253639 -WT3141WNXNO,3141,4191,Virgil Johnson,144.99930264374774,-37.829664835211155 -WT3141OOGAL,3141,4191,Francine Cardero,144.98916146393907,-37.83634340602355 -WT3101MKQBQ,3101,24605,Jeffrey Boger,145.016165903305,-37.789514982505544 -WT3070NTZSI,3070,8187,Hattie Hilton,144.99056659089558,-37.782210442188045 -WT3070PKQKW,3070,8187,Joseph Lankford,145.00987281086302,-37.7854423609157 -WT3070UIAUA,3070,8187,Ruth Whatley,144.99808273178186,-37.77688407018196 -WT3056DZVPH,3056,12236,Leonard Houser,144.97434877439903,-37.76285697143965 -WT3056SINUS,3056,12236,Angelina Doten,144.97172683083915,-37.76523841709616 -WT3802EJGIH,3802,12149,Maria Murillo,145.2654996546424,-37.97535452787995 -WT3802JFIGQ,3802,12149,Judy Susanin,145.2646955403689,-37.96887524277758 -WT3752TYZVC,3752,8020,William Ortiz,145.0990082854568,-37.6354444723332 -WT3752MDIOG,3752,8020,Debbie Davis,145.0801947102152,-37.656853118884825 -WT3752DTWRY,3752,8020,Shirley Vernon,145.11190147000818,-37.63334790990493 -WT3214SDJVB,3214,23964,Linda Bradley,144.3587251337974,-38.05556887988389 -WT3024REMLK,3024,3974,Stephen Mcdonald,144.6536083470412,-37.79961713947505 -WT3024ONESQ,3024,3974,Cathy Funke,144.65670260686147,-37.823722796741066 -WT3024OCPGU,3024,3974,Ricky Lessman,144.57353810144866,-37.92203392010761 -WT3024SWHMW,3024,3974,Cathy Ellison,144.6439391487586,-37.86605458157099 -WT3024AHCQK,3024,3974,Juan Greer,144.5955079869732,-37.87742233911276 -WT3024LLIXC,3024,3974,Robert Callen,144.67160191634878,-37.843914628376886 -WT3166YKFIY,3166,11878,Jane Orsini,145.09372343453362,-37.904756037479814 -WT3166LAGWZ,3166,11878,Elayne Sledge,145.10663609744375,-37.89032675058554 -WT3122QTFAA,3122,11755,Gertrude Mak,145.02069427862008,-37.83567746306098 -WT3122GVRSM,3122,11755,William Bell,145.0366394627393,-37.810997917513916 -WT3338VUNIK,3338,23412,Christine Smith,144.61166783914862,-37.68847556394404 -WT3182RKGMN,3182,5847,Dennis Vargas,144.98595893173,-37.85381160327312 -WT3182VNNPW,3182,5847,Julia Marshall,144.9720187701412,-37.851498667714225 -WT3182XUYBI,3182,5847,Carol Jepson,144.97584577516537,-37.865621833881825 -WT3182OEGBG,3182,5847,Russell Jutras,144.9908645797452,-37.85713703728914 -WT3145ZTUAZ,3145,23295,Mary Carter,145.07990126552414,-37.88660909527147 -WT3186JHMXL,3186,7751,Bertha Amos,144.99852209269145,-37.9108921514994 -WT3186TTDAZ,3186,7751,Delores Bryant,144.9981488714694,-37.892709124542016 -WT3186NJIYK,3186,7751,Joseph Aguilar,144.991208682922,-37.913922252633924 -WT3172MPWVX,3172,23089,Kenneth Martin,145.1163803602562,-37.98036690269593 -WT3075TFZBG,3075,11297,Angel Sledge,145.00050732794358,-37.66530476286956 -WT3075PQUNW,3075,11297,Rick Walls,144.97271489310629,-37.67002288868526 -WT3910TOMTM,3910,11294,Mary Conyers,145.17078673916086,-38.157889426030216 -WT3910GHRJL,3910,11294,Mike Bonneau,145.21511761712927,-38.129955676943375 -WT3131ZPDCI,3131,5626,Michael King,145.16871648542545,-37.803152773463914 -WT3131NBPZS,3131,5626,Janet Keller,145.1825300302115,-37.81979132355934 -WT3131XGUSR,3131,5626,Annette Russell,145.1587437004463,-37.80127846325513 -WT3131QOEGH,3131,5626,Billie Rodriguez,145.17986334885012,-37.83417363952394 -WT3192WYOED,3192,22291,Earl Maxwell,145.04432071046824,-37.96332078916971 -WT3155DIOQN,3155,22195,Edward White,145.30453693175082,-37.85124767277449 -WT3133ZMXPD,3133,22125,Darrell Baldwin,145.19895331609993,-37.83550615948766 -WT3124HDVOU,3124,22094,Thomas Merritt,145.08163136507585,-37.82770547789762 -WT3138GCDHE,3138,5491,Mark Montgomery,145.32553060424883,-37.781521967351715 -WT3138DJNRN,3138,5491,Lawrence Gries,145.30073129866167,-37.78882923312574 -WT3138NYAZI,3138,5491,Michael Jurczyk,145.3498041169002,-37.79662586519823 -WT3138RHEWT,3138,5491,Thomas Ferguson,145.306922187079,-37.78348718565499 -WT3171PHQVZ,3171,7238,Cedric Harrington,145.16498083635668,-37.95579674740436 -WT3171BGAEJ,3171,7238,Lila Levy,145.1337946019459,-37.92898751855743 -WT3171MJICH,3171,7238,Juan Hinchee,145.18043282568064,-37.95879127651984 -WT3011IQUNX,3011,7154,John Brown,144.89846041943312,-37.791085279625314 -WT3011UJIUE,3011,7154,Dixie Howell,144.89553897499536,-37.81371642915031 -WT3011EAEZY,3011,7154,Kenneth Carroll,144.877915863424,-37.80663443631112 -WT3340BDCGH,3340,21121,Paul Allison,144.40532457643525,-37.81327394581011 -WT3047DGPRJ,3047,10451,Tomas Mcguffee,144.92699546794756,-37.68255313490852 -WT3047ORCUE,3047,10451,Steven Amundson,144.90328678358944,-37.69247885083065 -WT3108XXEQC,3108,20826,Ashley Mangone,145.11485742234592,-37.79528171594063 -WT3201RUASD,3201,20711,Rose Williams,145.1534209754744,-38.10295740608137 -WT3153RLWDL,3153,5138,Mark Trice,145.2430628711565,-37.829803014239666 -WT3153NIFFF,3153,5138,Aaron Keeton,145.25168369388882,-37.83918200033715 -WT3153IUEOJ,3153,5138,Kenneth Shumaker,145.24728494005137,-37.84696139522771 -WT3153OMRBP,3153,5138,Lawrence Flores,145.26700117934192,-37.82422556609685 -WT3074OTBSU,3074,5130,Belle Oldham,145.03257710917762,-37.689203183058844 -WT3074WLDVX,3074,5130,James Dorris,145.0429477159794,-37.68859624847942 -WT3074JGVWJ,3074,5130,James Boyer,145.03672983553665,-37.6957613835056 -WT3074UPNMK,3074,5130,Kevin Rutherford,144.97495776808915,-37.688909196052016 -WT3104SCUNI,3104,5101,Richard Wilson,145.08704046031517,-37.79068586533052 -WT3104DAHNS,3104,5101,Daniel Hong,145.09809218475283,-37.786702025455035 -WT3104RFPOC,3104,5101,Mary Rodriguez,145.07950352110365,-37.7878012366993 -WT3104ONWBC,3104,5101,Juan Marrero,145.10568967543693,-37.793256776307054 -WT3825QDDSO,3825,10140,Juan Power,146.3474677656966,-37.84853345588591 -WT3825SLOEM,3825,10140,Vincent Booker,146.3977111844961,-37.598364025390914 -WT3181CQDJD,3181,10130,Scott Devlin,144.9973447457726,-37.84556221051096 -WT3181QMTHT,3181,10130,Amanda Hayes,144.99097016623716,-37.85274814551645 -WT3168VWWBG,3168,10098,Lena Nevarez,145.12812102003488,-37.91133584926299 -WT3168SIOCG,3168,10098,John Doyle,145.1486815513588,-37.91239574534277 -WT3135TXDWV,3135,9978,Christina Gray,145.24838863239054,-37.81113511494498 -WT3135MDMMN,3135,9978,Timothy Elder,145.2439049562688,-37.81805597385732 -WT3128RYVPJ,3128,6609,Edward Meeks,145.11265890537797,-37.83439480685845 -WT3128AQDRS,3128,6609,Sarah Kauffman,145.1295813912443,-37.82078823368618 -WT3128BXKMY,3128,6609,Nannie Howard,145.1205335888432,-37.84176430869057 -WT3219ERXHI,3219,4928,Robert Crites,144.40527369300378,-38.20792899559305 -WT3219MZCMM,3219,4928,Charlie Gerber,144.37942394090373,-38.19362930153523 -WT3219WYYSW,3219,4928,Cole Castillo,144.3946040268451,-38.170801213145026 -WT3219MBCXZ,3219,4928,William Carmley,144.40642142260077,-38.19293662482532 -WT3555MGTKL,3555,3281,Thomas Goodermote,144.23839337773072,-36.777089379729375 -WT3555IQZWF,3555,3281,Sandra Owens,144.20885234050343,-36.83529464107439 -WT3555TUBHB,3555,3281,Stella Wooldridge,144.24290208681947,-36.851299479751106 -WT3555TUPHO,3555,3281,Kathy Burleson,144.21497408060986,-36.79436925436562 -WT3555COGPQ,3555,3281,Brian Haynes,144.2066992252292,-36.826364551614084 -WT3555EIYEY,3555,3281,Mark Vaden,144.26284450476723,-36.80793454462067 -WT3193WAACK,3193,3251,Jose Ledesma,145.01476894747725,-37.97198343430003 -WT3193BXUZV,3193,3251,Paul Judson,145.048709489026,-37.969888821153035 -WT3193PUOIW,3193,3251,John Stoltenberg,145.0326368142497,-37.96688756716572 -WT3193GLLFK,3193,3251,Catherine Jones,145.04189978128645,-37.98374958296799 -WT3193MXQJH,3193,3251,Bret Obrien,145.036502806467,-37.97434285400492 -WT3193BFDLZ,3193,3251,Maricela Jones,145.0276458010249,-37.9757161499488 -WT3170FWYAE,3170,9684,Phyllis Prince,145.1720802821059,-37.9224765796093 -WT3170XJVWP,3170,9684,Lucy Lahay,145.17553159514887,-37.936150181976984 -WT3006GWSXT,3006,18808,Anthony Haynes,144.95907536829768,-37.82902551317974 -WT3068YCBLO,3068,18662,Pinkie Perez,144.99596168622807,-37.782887691087915 -WT3031DMFGC,3031,6177,Caroline Luckenbach,144.90707048527796,-37.78767901585732 -WT3031UFTFA,3031,6177,Christina Sanders,144.90480162904436,-37.79999367740217 -WT3031MEYAX,3031,6177,Kyle Johnson,144.90485123451955,-37.77890985650553 -WT3127KDCFK,3127,9222,Robert Garrison,145.11468989151496,-37.81742754036754 -WT3127FDBCA,3127,9222,Anthony Dawson,145.11410063194427,-37.83558955971916 -WT3677BNBDA,3677,6034,Gerald Worstell,146.33635542694262,-36.33507499644104 -WT3677EEGBM,3677,6034,Wesley Bond,146.29670074406582,-36.344999473632335 -WT3677TIDLO,3677,6034,Derrick Payne,146.27382202574398,-36.38615593280632 -WT3048LSNRB,3048,18029,Melissa Woodson,144.94202715958488,-37.661103475045735 -WT3228HJCOK,3228,2562,Paul Mcdonald,144.30259871797708,-38.294963469146026 -WT3228ACWJQ,3228,2562,Tonia Olson,144.31370275023198,-38.336499877690414 -WT3228PSYGN,3228,2562,Raul Jackson,144.19259656608287,-38.3239170790345 -WT3228MNYNJ,3228,2562,Lewis Shephard,144.3218961044523,-38.37079058190962 -WT3228QIIVY,3228,2562,Carl Whitley,144.3580998680485,-38.35158525171141 -WT3228NIQQU,3228,2562,Thomas Sood,144.22485445516622,-38.384604292155636 -WT3228VYIQE,3228,2562,Helen Perez,144.21350061075302,-38.388428144451055 -WT3930SMQKC,3930,4472,Rodney Griffith,145.08367715059237,-38.20218376519485 -WT3930YXHXA,3930,4472,Brittany Chen,145.0705302976687,-38.223967510272765 -WT3930LRSVX,3930,4472,Larry Kampman,145.06202825276205,-38.209569174577844 -WT3930EYEUK,3930,4472,Kim Rowell,145.11232729441548,-38.20586619599625 -WT3043FYBGJ,3043,17716,Kay Mitchell,144.9106703534703,-37.68347447460456 -WT3015PKLER,3015,8736,Bill Kilbane,144.8979183219914,-37.82580808335247 -WT3015IKLNZ,3015,8736,Nancy Martinez,144.90084568923905,-37.82284440696553 -WT3162WLIAO,3162,17448,Carol Smith,145.03794970392784,-37.893085476293294 -WT3129LJJMB,3129,17376,Michael Pilkington,145.10377490433146,-37.799158614303224 -WT3106WCDTM,3106,2374,Maria Guinn,145.12920376131098,-37.76777178042597 -WT3106WQFPR,3106,2374,Mary Bass,145.14274097499288,-37.731835101044354 -WT3106RKPDZ,3106,2374,Alexis Turner,145.1225375091099,-37.76566799999866 -WT3106WEMMG,3106,2374,Mary Brassfield,145.13831336893193,-37.76671007476117 -WT3106RGMJJ,3106,2374,Barbara Hippler,145.1378806908983,-37.74956882168008 -WT3106WWQAH,3106,2374,Melissa Wiggins,145.1447092521517,-37.741227564427945 -WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 -WT3140WMMWJ,3140,5510,Johnny Henderson,145.38704623013305,-37.73201219523685 -WT3140RDCJV,3140,5510,Amanda Stoeckel,145.4033084494358,-37.740104501522254 -WT3140IVMEB,3140,5510,Michele Erben,145.39434206753734,-37.72407305001604 -WT3840LNPIC,3840,5492,Maria Payne,146.34455903747144,-38.2733364542847 -WT3840TZEPL,3840,5492,Charles Finley,146.47175922778905,-38.36891972907457 -WT3840HGKLT,3840,5492,Kathleen Mcnutt,146.406943793533,-38.171958603481386 -WT3198HLLOO,3198,8231,Gretta Webb,145.14560608337254,-38.123088174882035 -WT3198JMWVV,3198,8231,Kyle Flores,145.1430483156538,-38.10348377700504 -WT3220GKZKP,3220,8176,Belen Ward,144.36016585654838,-38.14830817820786 -WT3220ZIKZX,3220,8176,Michael Smith,144.3647743147495,-38.14164316617978 -WT3356PYGHP,3356,16321,Patricia Randolph,143.84517878726803,-37.587543755661756 -WT3187GYVQY,3187,2285,Diana Anderson,145.00670556653714,-37.92915321568199 -WT3187STKWW,3187,2285,Rosalyn Gagne,145.01486064392816,-37.93029567721181 -WT3187VKZRS,3187,2285,Rhonda Houston,145.01239264065856,-37.91589285151207 -WT3187APRIK,3187,2285,Michael Rumph,145.01626056360175,-37.907326097781784 -WT3187VBBYP,3187,2285,Benita Seip,145.01730963025474,-37.93128775701515 -WT3187KANGU,3187,2285,Ivan Bragg,145.00315026723965,-37.92714051573115 -WT3187ISKAN,3187,2285,Rosemarie White,145.01673605674694,-37.913804417644954 -WT3352KHBBN,3352,15996,Richard Askew,143.60419898610786,-37.722432808576656 -WT3079LUHNU,3079,5329,Michael Hackett,145.04616665018042,-37.75945575126896 -WT3079YIXPG,3079,5329,Julia Mendez,145.0244537797928,-37.76320634770149 -WT3079QORWG,3079,5329,Jerry Somogyi,145.05361972090736,-37.76092644646485 -WT3820XLQYV,3820,3988,Ilene Lotthammer,145.89876454720408,-38.21940634596765 -WT3820PEKRB,3820,3988,Jennifer Sutton,145.98391239659566,-38.18069736504627 -WT3820MWDUD,3820,3988,Robert Hsu,145.88373482657425,-38.110247079460194 -WT3820DRLAO,3820,3988,Margarito Deane,145.9118289402152,-38.19483079087872 -WT3564XBKCM,3564,7972,Josephine Gilman,144.94175016410327,-36.12649018753725 -WT3564ZZDZJ,3564,7972,Herschel Boyles,144.83785837021406,-36.052980754665796 -WT3016QHOGE,3016,15560,Eugene Etheridge,144.88212846726813,-37.85329538993079 -WT3103UGROF,3103,7671,Anthony Cruz,145.07195794163297,-37.80237955055203 -WT3103BQYBO,3103,7671,Mamie Brooker,145.08901590487142,-37.807123263756104 -WT3161WKJSH,3161,15269,Blake Crippen,145.0220589964004,-37.86964694733445 -WT3125UPUEW,3125,3003,Lloyd Larsen,145.0985184852589,-37.85456180270574 -WT3125NGSQN,3125,3003,David Sams,145.1085054723482,-37.84198252992474 -WT3125GLAPQ,3125,3003,Robert Bush,145.1078397195417,-37.852238012039805 -WT3125JMVUR,3125,3003,Gerald Haynes,145.09939252257888,-37.853633814713106 -WT3125LLLNT,3125,3003,Joan Henderson,145.1127566726911,-37.86037272460842 -WT3222VJRRD,3222,2493,Rick Peterson,144.53591556523642,-38.15800474772625 -WT3222LIXKY,3222,2493,Roberta Bies,144.62223548689627,-38.2423945705524 -WT3222VBZHL,3222,2493,Lucille Mcdonald,144.56469007377729,-38.23214152585365 -WT3222PZVVW,3222,2493,Sallie Shiver,144.63169168975534,-38.25148580051897 -WT3222CPWEC,3222,2493,Mackenzie Curbelo,144.63106063817153,-38.149022173229504 -WT3222BXTZZ,3222,2493,Morris Rutherford,144.5269237026144,-38.14375836174202 -WT3850WPPZJ,3850,14779,Scott Buggie,146.99670975934802,-38.11120375121315 -WT3147QAQPS,3147,4879,Mark Hinton,145.07541389986514,-37.863627463390735 -WT3147NMGOD,3147,4879,Tracy Bowling,145.0744381846769,-37.8587199206138 -WT3147GJGOI,3147,4879,Cornelius Massengale,145.08808621714442,-37.874757229777096 -WT3400BOZRI,3400,14543,Tom Davis,142.2056868163526,-36.700923449995635 -WT3033ORKFG,3033,14514,Robert Ellsworth,144.8828197808778,-37.742567964334405 -WT3123AWJNB,3123,7160,Marla Siddon,145.05865200046156,-37.83745393770321 -WT3123YZTIF,3123,7160,Paul Earwood,145.05955004240124,-37.82771644759941 -WT3039PBUWA,3039,14250,William Loudermilk,144.92569491883987,-37.765896444531656 -WT3224GRCHF,3224,1773,Maria France,144.44358513125866,-38.21036217909221 -WT3224ZMKSY,3224,1773,Helen Givens,144.41179731951956,-38.15749110854475 -WT3224TNYRI,3224,1773,Michael Israel,144.43655018372564,-38.23965258686051 -WT3224WHHVC,3224,1773,Janis Bagwell,144.45785698279343,-38.186164482416075 -WT3224QJEKV,3224,1773,Bonnie Yearout,144.3989607589969,-38.148372448893284 -WT3224VWVGY,3224,1773,Carl Smith,144.43939681993942,-38.18036746232096 -WT3224OGJJN,3224,1773,Shirley Hall,144.42849521054393,-38.218027859101916 -WT3224DHBWH,3224,1773,Marvin Solis,144.41774574409718,-38.234792588444314 -WT3818GNUCA,3818,14167,Theodore Foreman,145.78951378758498,-38.1167604782299 -WT3226KFMJB,3226,4721,James Sturkie,144.53086672694207,-38.2805983450651 -WT3226NDZWQ,3226,4721,Lloyd Smith,144.5320642015993,-38.27604936623179 -WT3226QUEJX,3226,4721,Mary Stephenson,144.54568575976018,-38.26255690044443 -WT3085IMQNY,3085,13886,Henry Weichel,145.079442159054,-37.735611465967196 -WT3137CDPKF,3137,1541,Keith Stahlman,145.31504320734498,-37.81271433615267 -WT3137XUGBY,3137,1541,Brittany Randle,145.30978516235317,-37.82966565146038 -WT3137SRQVP,3137,1541,Michael Miller,145.3309626109994,-37.83705748721143 -WT3137CZXZW,3137,1541,Edward Vargo,145.33051928414244,-37.82106124500591 -WT3137MGNNQ,3137,1541,Paul Mccorkle,145.30021053704837,-37.80671786701049 -WT3137MJNVX,3137,1541,Sophia Derentis,145.31209224470845,-37.79998391319509 -WT3137PJCVG,3137,1541,Yolanda Stern,145.32887887734955,-37.830025027117365 -WT3137PDNLC,3137,1541,Katherine Cortez,145.31543525088134,-37.81532454600134 -WT3137ZASSV,3137,1541,Catherine Wilson,145.31014451555873,-37.80605239381773 -WT3107BZRNW,3107,4517,Christopher Barnhart,145.1247483858036,-37.76600305637294 -WT3107GYDUG,3107,4517,Stephen Gauger,145.12223287485645,-37.753813171989556 -WT3107VOAOZ,3107,4517,Inez Jennings,145.11629896103574,-37.75239414419074 -WT3556KXCCS,3556,3271,Arron Beauchamp,144.0883649725357,-36.713782960347814 -WT3556NJQUO,3556,3271,Kevin Hackney,144.18023633494656,-36.70627537855721 -WT3556PILGU,3556,3271,Regina Faust,144.11993270090272,-36.71516722997884 -WT3556HIKOY,3556,3271,Diane Wright,144.06787192390885,-36.685858858259905 -WT3355SMNPW,3355,6507,Garrett Wohner,143.7954393324715,-37.498485881815036 -WT3355YJDEY,3355,6507,Isabelle Rice,143.82135772891525,-37.54931090865537 -WT3194BAYCO,3194,12965,Jodi Hadden,145.0624771809979,-37.98414293023302 -WT3142YDQRA,3142,6454,Martha Arterberry,145.00915503895573,-37.8503210054816 -WT3142XWZQO,3142,6454,June Downer,145.02569139013218,-37.842355148933564 -WT3305RFTWU,3305,3204,Harold Ferreira,141.24389275383595,-38.057775476418286 -WT3305TLQLM,3305,3204,Randall Ruffner,141.38702436846057,-38.063546792527006 -WT3305NMFYC,3305,3204,Larry Witter,141.29643421841453,-38.11167114301085 -WT3305KWOFD,3305,3204,Judith Figueroa,141.25644777166127,-38.24079323443777 -WT3018XAVWL,3018,12689,Helen Cannon,144.7757997220566,-37.84941663250125 -WT3041ZBAWR,3041,3103,Eleanor Giles,144.90572295653493,-37.71357670803631 -WT3041EFUEB,3041,3103,Mary Seda,144.90317959622467,-37.73250491358593 -WT3041AJAHR,3041,3103,Marcelina Malone,144.9233764621801,-37.72632689490257 -WT3041GXQOB,3041,3103,Sandra Linsley,144.8943051892376,-37.737252273500395 -WT3250BJUFW,3250,6125,Howard Casey,143.5658226194567,-38.340870067720694 -WT3250ORKZX,3250,6125,Dayle Ward,143.56058751062506,-38.32020730830798 -WT3941IMDBZ,3941,12172,Christopher Ryan,144.78630521204593,-38.353220128503 -WT3025OMYBR,3025,2430,Georgene Mcvay,144.87256703440102,-37.834135335229035 -WT3025JXFHB,3025,2430,Bonnie Downin,144.81149412873438,-37.8307798053919 -WT3025SSHJN,3025,2430,Tyler Moons,144.8607062768072,-37.83481483800496 -WT3025FPAHS,3025,2430,Joyce Munn,144.79563297522262,-37.82634923994355 -WT3025UXSIE,3025,2430,Willie Laigo,144.79429337101448,-37.82881778367748 -WT3089VZMEY,3089,5866,Gary Harper,145.1487810665617,-37.67651676508226 -WT3089JYMHF,3089,5866,Dorothy Reid,145.15856967777128,-37.684864473616706 -WT3078AEKPE,3078,11638,Dexter Good,145.00140644595922,-37.76493422121156 -WT3034FCAXP,3034,2908,Winifred Sears,144.86879041622356,-37.75579478738804 -WT3034DODDT,3034,2908,Olivia Mctigue,144.86123163230448,-37.77142997149443 -WT3034ZYMIL,3034,2908,Donald Salvo,144.84766226766504,-37.7513737230498 -WT3034BFDJN,3034,2908,Janice Johnson,144.86548847067067,-37.774191057535255 -WT3631TQNZV,3631,2322,Jason Burkett,145.4363498286167,-36.31970925700745 -WT3631NDVKY,3631,2322,Ernest Jarrell,145.52535564282212,-36.335961472056894 -WT3631VJGLO,3631,2322,Nora Kelly,145.4546604189178,-36.45306461119483 -WT3631QGZOC,3631,2322,Teresa Pickett,145.4473711799922,-36.37508002234908 -WT3631ZSUMB,3631,2322,Thelma Carlton,145.533912908864,-36.3800742996389 -WT3197VSZGX,3197,5774,Mary Edwards,145.15664578721774,-38.08070005147733 -WT3197HMHVF,3197,5774,Ann Somerville,145.12310528133722,-38.086811727473744 -WT3057EKGHR,3057,11504,Rosemary Tiger,144.9799749433599,-37.77342887683817 -WT3177XFTPO,3177,3768,Bonnie Studivant,145.2322298542572,-38.0053537370745 -WT3177SLLBH,3177,3768,Rosetta Miller,145.23162850607062,-37.98363939529452 -WT3177TWMBO,3177,3768,Grace Huff,145.22954841602555,-37.992617480012846 -WT3585AFUMM,3585,11206,Ray Howe,143.37572389146328,-35.31277481441913 -WT3936ONNXE,3936,11024,Lisabeth Griego,144.98877850527248,-38.34453491575655 -WT3205CQCBS,3205,5460,Carol Troy,144.96625085578012,-37.83921661275396 -WT3205YOMLV,3205,5460,Ruby Austin,144.96598185610463,-37.83222345331254 -WT3105HWZUC,3105,10873,Thomas Stevens,145.0793227627599,-37.759546369688216 -WT3803NHPOC,3803,5427,Larry Combes,145.28746561363045,-38.02446244976362 -WT3803ECHEF,3803,5427,Willie Robertson,145.25915636961093,-38.02390681128392 -WT3777BKKPU,3777,3583,Byron Robinson,145.56251489376504,-37.514394044516564 -WT3777XHWTI,3777,3583,Helen Sullivan,145.5831890489861,-37.61249810449512 -WT3777TUHYI,3777,3583,Michael Livingston,145.52058795514893,-37.65224612703273 -WT3978EELMS,3978,10648,Andrew Tylor,145.31853095518233,-38.091686569586926 -WT3190LSXPY,3190,10454,Carl Velazquez,145.05876365045188,-37.948438331194595 -WT3437HTTIH,3437,3479,Benjamin Warner,144.63779108476163,-37.469629767097395 -WT3437TZCMM,3437,3479,Donald Sandoval,144.51080560660586,-37.50036783211931 -WT3437KHBPL,3437,3479,Charlotte Green,144.59696365066134,-37.48113208398435 -WT3008PNJNN,3008,5218,Ralph Barkley,144.9518521922696,-37.81145194486184 -WT3008JHENP,3008,5218,Cynthia Shields,144.92668824617908,-37.823212653316155 -WT3672CRWAS,3672,5165,Mark Mohler,145.95064248540996,-36.584029923356006 -WT3672RXSCH,3672,5165,Ronald Harbin,146.00884073469686,-36.563773100689275 -WT3151QBMSM,3151,3424,Malcolm Little,145.15885697551238,-37.85776252887035 -WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 -WT3151JBTSG,3151,3424,Ashley Manning,145.1326095487824,-37.85076505375052 -WT3191GBTSQ,3191,10241,Laura Ryan,144.9960217828986,-37.944975559503995 -WT3995ZBHTV,3995,10173,Leigh Craven,145.61781035048253,-38.556131563368474 -WT3300SXKBR,3300,5044,Martha Jones,141.943401661104,-37.66005370567887 -WT3300BEMMJ,3300,5044,Ricky Stonebraker,141.94272923667302,-37.768451341073664 -WT3915YKMGK,3915,9960,Melissa Butler,145.1013485299018,-38.32429035535604 -WT3116JXQMD,3116,4936,Susan Tucker,145.3372717131245,-37.71671338410589 -WT3116SVYNP,3116,4936,Rickey Labarbera,145.29685887066887,-37.74611473508058 -WT3691QKGPV,3691,9704,George Quinones,146.63888213422413,-36.309341832307794 -WT3377FUDEI,3377,9416,Linda Olsen,142.9596593170925,-37.27763193783621 -WT3004PTTBC,3004,3102,Velma Stewart,144.97791590174103,-37.82012529523898 -WT3004EMANT,3004,3102,Steven Shepperd,144.98788265746035,-37.81686712169189 -WT3004PMCVW,3004,3102,Christopher Brown,144.98359216736148,-37.84437498132179 -WT3049MXNED,3049,3087,Loretta Hinderman,144.89821647835635,-37.66293779630895 -WT3049IAJCL,3049,3087,Brian Davis,144.91179868117703,-37.67996627573396 -WT3049FVZGN,3049,3087,John Smith,144.91072359690028,-37.662653490772016 -WT3644SBXGF,3644,4613,Robert Reyes,145.7529888801693,-36.03665059744477 -WT3644NLXJO,3644,4613,Curtis Hoke,145.5435986973334,-35.876136960997215 -WT3019ASCJP,3019,3065,Charlotte Coutermarsh,144.85492421197495,-37.772589492919515 -WT3019JIKGX,3019,3065,Vincent January,144.85730316799982,-37.7718018219131 -WT3019RXXZW,3019,3065,Amy Taylor,144.8599464042601,-37.774918978474545 -WT3764ZHPVF,3764,4582,Tara Ward,144.9533178550078,-37.10942527971903 -WT3764MKCUE,3764,4582,Alejandrina Salazar,144.970506104261,-37.15854276662507 -WT3629PMEPU,3629,9127,Reid Feldmann,145.21981730157358,-36.35945078374604 -WT3143DCPOC,3143,3018,Mary Bowers,145.02938317853184,-37.86258914550739 -WT3143IYVIZ,3143,3018,James Kemp,145.02759917907088,-37.857112959399466 -WT3143NQMZP,3143,3018,Francisco Gutierrez,145.01040076549717,-37.861596046002276 -WT3087WBGNY,3087,9031,Carl Estabrook,145.07655868788908,-37.70421795747069 -WT3757QOZTE,3757,2986,Kathleen Reiner,145.342552305163,-37.51695722666812 -WT3757ZYUMU,3757,2986,Meghan Pignone,145.18645133524964,-37.422662010662926 -WT3757PRIEV,3757,2986,Larry Pierce,145.1118904508526,-37.46718538934005 -WT3730UTUPX,3730,2944,Curtis Johnson,145.8390200963087,-36.01276678240247 -WT3730XYUBK,3730,2944,Diane Ulberg,145.7667686668467,-36.01802053425753 -WT3730EFJWK,3730,2944,John Nelson,146.19031829509552,-36.09578729271634 -WT3148QGULY,3148,4320,Priscilla Little,145.10910727319913,-37.88503978009914 -WT3148LWECX,3148,4320,Belinda Jefferson,145.1011737287189,-37.880916247729026 -WT3066ORIHJ,3066,2128,Doris Hazard,144.98926829046363,-37.80512744956145 -WT3066PVXAM,3066,2128,Josh Cecil,144.9862688428555,-37.79776592949474 -WT3066TZXKY,3066,2128,Greg Rodriguez,144.98624403796103,-37.80627173136043 -WT3066TGSMU,3066,2128,Lillian Hesser,144.98728939865242,-37.798371404841745 -WT3113YCFFU,3113,4228,Lula Carter,145.22572505521666,-37.73935349050789 -WT3113NDCEY,3113,4228,Antonio Hill,145.18073448457255,-37.73230213369918 -WT3054SQEQA,3054,8428,Eugene Salano,144.95861592679725,-37.783412869711185 -WT3620DPAMB,3620,4120,Ben Oneil,144.96824098896346,-36.398921729744224 -WT3620XKMXQ,3620,4120,Julie Zazula,145.18651160619237,-36.185252751663754 -WT3067PFFLY,3067,1366,Willie Raggs,144.99277550851377,-37.81165277804152 -WT3067QULCR,3067,1366,Thomas Gordon,145.00799772925978,-37.80647549142817 -WT3067RDWCI,3067,1366,Lynette Erwin,144.99182058019107,-37.80684026619632 -WT3067MKBAR,3067,1366,Jeffry Huber,144.9965119159561,-37.806957906476974 -WT3067WJXTJ,3067,1366,Judith Eckenrode,144.9891625434605,-37.80163864602102 -WT3067BLHHJ,3067,1366,Margery Smith,144.9948893230766,-37.80237623916429 -WT3351UVIHV,3351,8168,Donald Wilkinson,143.27416699148256,-37.614929659179204 -WT3804RXIMQ,3804,2023,Terrance Bromley,145.310885608323,-38.001442816771736 -WT3804OQOOF,3804,2023,Jackie Smith,145.35298253700518,-37.98426462189473 -WT3804JDRQA,3804,2023,Robert Porter,145.28323835023517,-37.95378621144045 -WT3804MBVLD,3804,2023,Polly Hoople,145.33015033642127,-37.98767496906432 -WT3126UEECR,3126,8056,Dianne Nance,145.08096937230013,-37.8210242477313 -WT3909HFRJQ,3909,2633,Maria Rhodus,147.90601975805444,-37.764598529015366 -WT3909AXOWH,3909,2633,Kristie Bode,148.0555693607876,-37.78991129086548 -WT3909VJNLQ,3909,2633,Soledad Hurtado,148.10035183210377,-37.724162743489586 -WT3953WADSR,3953,1571,Clinton Bailey,145.78786815135106,-38.43916558433166 -WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 -WT3953GRHIM,3953,1571,Stuart Doyle,146.07894653869226,-38.46139149239377 -WT3953GRXRE,3953,1571,Sylvia Brown,146.17199619819715,-38.38154682840454 -WT3953NPQQN,3953,1571,Peter Willer,146.04193592469497,-38.44633595871089 -WT3782AQUFZ,3782,7827,Bonita Mangan,145.4551855517829,-37.92661137122033 -WT3922MDPCX,3922,1289,Bruce Kruse,145.25316073669387,-38.51899609588197 -WT3922JVYVK,3922,1289,Tara Law,145.17599762291508,-38.487246277390646 -WT3922JDUTN,3922,1289,Judy Ross,145.28537516549176,-38.51407044024659 -WT3922WWJZY,3922,1289,Elijah Hunt,145.2447827591404,-38.4848574951737 -WT3922GKMBB,3922,1289,Brady Oglesby,145.18995016670905,-38.48860277298002 -WT3922PHWRX,3922,1289,Louise Mcdonald,145.2376742866865,-38.46448487862177 -WT3660XHDRV,3660,1262,Erik Guel,145.5051483633239,-36.91390306327884 -WT3660CESRK,3660,1262,Kim Graham,145.3228931083454,-37.10179760482139 -WT3660BHLDZ,3660,1262,Brian Brasil,145.50018943200558,-37.10893561456951 -WT3660UOMTS,3660,1262,Susan Storm,145.467449588922,-37.07762299407432 -WT3660QSTIB,3660,1262,Dennis Nguyen,145.28496089529546,-36.996553633203206 -WT3660ZHPVI,3660,1262,Jeff Fetherston,145.07968244652514,-37.052214044405076 -WT3180WOFIE,3180,2487,Catharine Diaz,145.26273417587512,-37.90066045017715 -WT3180KJTWT,3180,2487,Julie Hash,145.25618519655262,-37.87398522411325 -WT3180DKICU,3180,2487,Phyllis Terry,145.23918782404462,-37.884144489556725 -WT3223OOZBW,3223,2465,Sheila Gray,144.63524592163125,-38.20656233788676 -WT3223RWIHD,3223,2465,Theodore Christopher,144.61706094924273,-38.1020143467612 -WT3223JFBYI,3223,2465,Guy Larocca,144.61099219539284,-38.16247156775349 -WT3809YTBHH,3809,1802,Florence Williams,145.43460663547293,-38.02183804740044 -WT3809PDGEK,3809,1802,Nicole Dye,145.4070791349842,-38.065057490534805 -WT3809ZYQDB,3809,1802,Peggy Anderson,145.45372252218934,-38.045085403051246 -WT3809JZQMX,3809,1802,Joseph Mayers,145.45613861143133,-38.121534959744224 -WT3860OPGLP,3860,2390,Jason Evans,147.09728938038828,-37.96253281803679 -WT3860BZTXE,3860,2390,Lucille Johnston,147.1448485506306,-37.711905494546116 -WT3860UCTWZ,3860,2390,Calvin Klein,147.17829920967256,-37.86321009958664 -WT3807TGUBX,3807,2365,Dorris Pennington,145.37070956738168,-38.05107840171075 -WT3807UFNAP,3807,2365,Francis Montgomery,145.40416010092343,-38.021356613911976 -WT3807PZHPR,3807,2365,David Pizarro,145.3626328162128,-38.05489065080597 -WT3450XHQGS,3450,1708,Willis Jasso,144.22386015866184,-37.061341934677074 -WT3450JQQRD,3450,1708,Robert Wood,144.24981065143234,-37.06989150317421 -WT3450FASHP,3450,1708,Tonya Cross,144.20704326499535,-37.06521131515332 -WT3450LBNRD,3450,1708,Caitlyn Warden,144.24347782702498,-37.04838315318216 -WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 -WT3765XZDSF,3765,3380,Susan Compton,145.32698014492004,-37.82618684116462 -WT3158AUSOJ,3158,3326,Vanessa Adams,145.34291881249214,-37.90412906071253 -WT3158FLOBC,3158,3326,Elbert Sutton,145.33108911112143,-37.920765975046 -WT3027KUPSY,3027,3323,Sonya Renick,144.7621343752908,-37.861911455007174 -WT3027FZKQC,3027,3323,Angelo Hard,144.73167189283603,-37.85646049026309 -WT3217MDZVX,3217,6607,Andrew Ward,144.40663713124954,-38.2996197431434 -WT3380GWOCZ,3380,6032,Clyde Gallo,142.84006482043034,-36.992418579611 -WT3179QTYXJ,3179,3011,Darnell Phelps,145.2050895825477,-37.91374760225387 -WT3179QKUWC,3179,3011,Wendy Baker,145.19746265109166,-37.90965455901277 -WT3036XTIIL,3036,1481,Katherine Miller,144.77405705329488,-37.68738739758373 -WT3036CKDXS,3036,1481,Harold Harmon,144.81961864598148,-37.66870859055842 -WT3036IQITW,3036,1481,Douglas Downs,144.78389069686594,-37.66161092059724 -WT3036OUJLY,3036,1481,Jenny White,144.8312170300855,-37.67194392009214 -WT3189MHBOB,3189,1179,Wayne Bello,145.05523156176483,-37.94118140841387 -WT3189LGHIA,3189,1179,Annie Longmore,145.06543156075276,-37.939107386085695 -WT3189ZUMEU,3189,1179,Susan Flores,145.04315019561668,-37.937324860748454 -WT3189EWADM,3189,1179,Christopher Anderson,145.03717703278747,-37.94372275534058 -WT3189VOGYS,3189,1179,Jill Smith,145.03754557173104,-37.942023554760674 -WT3799ZWGYC,3799,1932,Lana Jones,145.88439101081204,-37.69655285293283 -WT3799IBQMR,3799,1932,Camilla Swenson,145.88316517396308,-37.742377391043284 -WT3799JWZTS,3799,1932,Willie Barone,145.6961436573016,-37.650946513835954 -WT3851KHODW,3851,2843,Tara Garza,147.29430937004628,-38.222542302101765 -WT3851YKVHY,3851,2843,Jeffrey Clark,147.4335844947092,-37.987941395300496 -WT3996ZMYGL,3996,1846,Jennifer Adkins,145.7771574897382,-38.67107249698782 -WT3996YCWHN,3996,1846,Kendall Pruitt,145.71188329405038,-38.66201360381448 -WT3996APJTL,3996,1846,Ronald Cook,145.77210936101585,-38.66087320895411 -WT3003QBFSM,3003,1838,Michael Blevins,144.91998133092056,-37.81279720127272 -WT3003VUBNO,3003,1838,Doris Smith,144.91338943948188,-37.81827164893964 -WT3003BXJAK,3003,1838,Vera Mitchell,144.92878408202418,-37.798436262713885 -WT3579FLKUI,3579,1788,Daniel Ruark,144.01732514096102,-35.954113241603984 -WT3579HGUQO,3579,1788,Laura Smith,143.56878720073288,-35.87996758720554 -WT3579ZMHJW,3579,1788,Yolanda Early,143.90579325337166,-35.83008267688475 -WT3616MGKKD,3616,2678,Flossie Stclair,145.0382395354934,-36.48540758333834 -WT3616OIHDJ,3616,2678,Virginia Parris,145.0987959215873,-36.5227154806513 -WT3636ETBDB,3636,873,James Reardon,145.42411679647267,-36.13415691671104 -WT3636LTWLQ,3636,873,Amy Gurry,145.5876432641729,-36.08288311428853 -WT3636LGQMA,3636,873,Arthur Stgermain,145.44985593950616,-36.056801348170765 -WT3636ZRPAC,3636,873,Donald Renz,145.57637663494174,-36.067347824534416 -WT3636ZFUGM,3636,873,Susan Welchel,145.4256515582462,-36.05797348648649 -WT3636HKVUH,3636,873,Stanley Jones,145.40354855082188,-36.135166241815746 -WT3984XMPJU,3984,1041,Bernard Robinson,145.66611292275098,-38.41371341264712 -WT3984UBSFJ,3984,1041,Ned Johnson,145.61381415852048,-38.3660140349184 -WT3984SHWQW,3984,1041,William Owen,145.59521341508736,-38.282975922513835 -WT3984QFXFT,3984,1041,James Prewett,145.48971810892024,-38.317370725661895 -WT3984IZIBD,3984,1041,Cesar Medina,145.65147470367967,-38.25469355497106 -WT3434AMRMK,3434,5069,Sonia Polanco,144.7102829177065,-37.414787654577225 -WT3061TZMKP,3061,1685,Phillip Lynch,144.96238876406008,-37.65056788272415 -WT3061LOUYX,3061,1685,Ronald Thompson,144.97374071978143,-37.64821258420374 -WT3061BZKPA,3061,1685,Cecelia Lewin,144.97230861471036,-37.64316122799456 -WT3722XULRS,3722,5018,Helene Huber,146.19396910715247,-37.08656660910376 -WT3002YFCMY,3002,4964,Dora Grooms,144.97412033255623,-37.811182979448056 -WT3940WZCWZ,3940,2465,Gloria Roberts,144.86715846693173,-38.37676586477035 -WT3940UVMRS,3940,2465,Harold Kassab,144.88951915153942,-38.375089887240684 -WT3981DOYYE,3981,1632,Ruth Roberts,145.40357770711884,-38.22648087703851 -WT3981LHGQV,3981,1632,Michael Hayes,145.7241613476498,-38.26428001607835 -WT3981HFCDJ,3981,1632,Nellie Cassella,145.42159162016495,-38.25805321222125 -WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 -WT3950WWFHI,3950,2400,Donald Neil,145.789697571232,-38.44829776894874 -WT3950QHSQT,3950,2400,James Guerrero,145.8537009069294,-38.42146300495086 -WT3842LLUAZ,3842,2391,Justin Butcher,146.43738290720543,-38.33409319136186 -WT3842UWRZX,3842,2391,Daniel Cole,146.4260527153197,-38.31033873786668 -WT3747DHCFR,3747,2312,Delia Haynes,146.8417942671603,-36.36420895477979 -WT3747XBOXY,3747,2312,Homer Moore,146.75846945554298,-36.41270523624899 -WT3781EASUZ,3781,1492,Carmelo Nicholas,145.47483429717292,-37.93712078940373 -WT3781QLYFA,3781,1492,Sharon Trask,145.5257307263254,-37.87860456041545 -WT3781NYYHV,3781,1492,Lynda Nastasi,145.489813558002,-37.99277716147479 -WT3401EAPLO,3401,2210,Eric Ellis,142.10320851191588,-36.72822117152589 -WT3401WPITF,3401,2210,Kevin Woods,142.45385599031363,-37.254109629673565 -WT3461QSXXB,3461,4149,Stephanie Troupe,144.19879954226982,-37.16497108770965 -WT3225ZLHVP,3225,1352,Theola Pugh,144.6151145784595,-38.24951546874845 -WT3225ZWRKT,3225,1352,Sierra Zelaya,144.63248453729392,-38.273920927385454 -WT3225RKBIH,3225,1352,Eric Clark,144.60253933576172,-38.23799434037219 -WT3213XUYAP,3213,4033,Jordan Billings,144.20150739455903,-38.09131990974338 -WT3880XJEVE,3880,2016,Brady Condon,147.8819082206602,-38.0163438406868 -WT3880BUCZX,3880,2016,Michael Andersen,147.82927661233808,-37.86188798085973 -WT3971GFDIU,3971,669,Shirley Solis,146.8002601948809,-38.7598825163408 -WT3971UHZGX,3971,669,Lien Yoon,146.72931020113865,-38.46557168867185 -WT3971MGARE,3971,669,Joseph Nutter,146.42859858283558,-38.67926740909462 -WT3971MLSXH,3971,669,Beverly Hardt,146.86063586361163,-38.55173732935933 -WT3971XBBMK,3971,669,Grace Gordon,146.87348584083944,-38.725544946677644 -WT3971GNWLP,3971,669,Patti Kennedy,146.47649393813555,-38.61329665766569 -WT3431IFUSY,3431,3947,Nellie Adams,144.6804185372361,-37.442212511059296 -WT3093HJWIG,3093,972,Benjamin Meadows,145.10671344464265,-37.74423120940089 -WT3093UMONC,3093,972,Chris Mckinney,145.12667114522216,-37.72572554970407 -WT3093NLHIM,3093,972,Joshua Coons,145.11820148991805,-37.74433369520455 -WT3093ROONW,3093,972,Sharon Wells,145.11554389950476,-37.747315564024305 -WT3775QKPWA,3775,772,John Covington,145.31376604275735,-37.628386398987416 -WT3775DRWUQ,3775,772,Kathleen Besson,145.4407141306498,-37.5625062579209 -WT3775TOGZK,3775,772,Amy Casey,145.4385089903036,-37.64127240412888 -WT3775PGCXX,3775,772,Margaret Mix,145.36522115782017,-37.59791868890256 -WT3775HGGFI,3775,772,Joseph Roshia,145.2776078617146,-37.59705480543411 -WT3918DSFOP,3918,926,Lindsey Jackson,145.1805234976719,-38.33830054668654 -WT3918IJIJQ,3918,926,Sean Conroy,145.1981144167953,-38.316951703963106 -WT3918FYJQN,3918,926,Flossie Hudson,145.14086679590315,-38.350153661359435 -WT3918CDEEZ,3918,926,Connie Beveridge,145.16250445821373,-38.34608816687449 -WT3523CQSWP,3523,905,Mark Seller,144.72894916684078,-37.00934236074207 -WT3523JHSKW,3523,905,Jerry Barth,144.56391677604657,-36.97463976031401 -WT3523XJZBV,3523,905,Charles Donnell,144.7473429583665,-36.770146356766034 -WT3523VFRMV,3523,905,Gina Pickle,144.8838222135247,-36.7036137884041 -WT3549JBGSR,3549,1174,Christopher Shiever,142.6845872365345,-34.77636039256747 -WT3549KQPCN,3549,1174,John Mitchell,142.94017265436088,-34.72498458121197 -WT3549RPPGD,3549,1174,Brandon Handley,142.5652089698158,-34.67445434684168 -WT3363LPXKX,3363,1739,Arthur Washington,143.80051932471937,-37.43976981496703 -WT3363UVPZV,3363,1739,Ahmad Edmondson,143.96168044083402,-37.36188835464135 -WT3797FCQZL,3797,1738,Dawn Link,145.59712782997835,-37.885650618120096 -WT3797JXEYZ,3797,1738,Wade Seay,145.59525777895735,-37.85187937890587 -WT3925TJOQL,3925,1128,Stephanie Mueller,145.3722231137187,-38.53323415588145 -WT3925HPDPE,3925,1128,Patrick Mckinley,145.40598118455455,-38.51067698346221 -WT3925LANPO,3925,1128,Alex Mcdonald,145.3952406888683,-38.50885963827309 -WT3980JJOQY,3980,1675,Heather Strahl,145.42551264755082,-38.208375772057366 -WT3980CXZJX,3980,1675,Marianne Gulledge,145.38407991603268,-38.234540388656654 -WT3913EJDEA,3913,3338,Norma Hammond,145.1598674095822,-38.281966498905305 -WT3919IOIFE,3919,3183,Candice Redman,145.20106213477456,-38.34719888248039 -WT3862WPONG,3862,1578,Anthony Dawkins,147.33271058732282,-37.491238739170896 -WT3862XHAPV,3862,1578,Michael Stover,147.32373694126133,-37.84325812411646 -WT3741DMMXM,3741,3100,Gwendolyn Donaldson,146.97457672634275,-36.739842150839856 -WT3266OQUZV,3266,3067,Jack Wilcoxen,143.24967426940597,-38.463018360522085 -WT3808KZZPA,3808,1516,Asuncion Mays,145.46459157313026,-38.00294661504681 -WT3808MMGCV,3808,1516,Alice Schmelz,145.47627366088184,-37.96999032738656 -WT3858VBJEZ,3858,1008,Frank Mckay,146.4643872269934,-37.70128412623101 -WT3858TSNDX,3858,1008,Angela Dexter,146.81008375978269,-37.217445513139786 -WT3858IFQCA,3858,1008,Pauline Botkin,146.59834034532963,-37.4913716247717 -WT3723LMJSJ,3723,1502,Oscar Sears,146.27332024772176,-36.948121056075905 -WT3723ARNTR,3723,1502,David Dunaway,146.07736519208603,-37.2571342766942 -WT3821UBUGE,3821,1458,Clarence Harty,146.01659205377223,-38.22109648407308 -WT3821GKQVH,3821,1458,Tina Rogian,146.04675100939392,-38.19914720889278 -WT3202IDOPR,3202,1453,Shannon Bello,145.07561474247163,-37.947828524869706 -WT3202VGFWI,3202,1453,Edward Mohorovich,145.0981452676193,-37.94451896393119 -WT3871VBOCO,3871,1451,David Hudnell,146.05740583635816,-38.491370012341534 -WT3871XVSOD,3871,1451,Mark Martinez,146.26247857549268,-38.26173487936323 -WT3435VCHKG,3435,1439,Vernon Revak,144.7089588943855,-37.31146009548804 -WT3435JZWPT,3435,1439,Felix Barth,144.69925406147158,-37.247863420517085 -WT3938HFIAY,3938,2823,Robert Cashio,144.93339758681753,-38.36495278578952 -WT3956NITYU,3956,940,Liz Quinonez,146.1714906085415,-38.80866659787346 -WT3956DVIYM,3956,940,Carol Twichell,145.78969686154355,-38.615205287883846 -WT3956VQBJJ,3956,940,Jesus Fabbri,146.00509974244184,-38.86981870990471 -WT3418MGKYO,3418,2772,Joyce Smith,141.97956043404395,-36.27578953921955 -WT3304LTOER,3304,681,James Broadway,141.91304296053238,-38.08286392590754 -WT3304USCDE,3304,681,Pat Smith,140.93954785911416,-38.22891906650568 -WT3304KHKYN,3304,681,Robert Magnuson,141.9041115605597,-37.909520270955575 -WT3304ZOOWD,3304,681,Johnny Huszar,141.39029459667637,-38.230244337190726 -WT3685BGXYX,3685,1361,Michael Weatherspoon,146.56300339579627,-36.06275691306193 -WT3685KJYXY,3685,1361,Shirley Prescott,146.3159746578374,-35.97378625619464 -WT3816RKVGQ,3816,2721,Winston Steinberg,145.76227139481438,-38.05153945228166 -WT3393KRBTF,3393,2685,Brenda Neil,142.2439016007552,-36.06948475728159 -WT3717WFWMH,3717,378,Craig Carlson,145.22341733206022,-37.50301192704405 -WT3717DKRXQ,3717,378,Herbert Rumph,145.6371099034687,-37.39509154708391 -WT3717MXQAF,3717,378,Eddie Campbell,145.272309284533,-37.47847706412625 -WT3717YSAOA,3717,378,Woodrow Spangler,145.361057179615,-37.414640086471316 -WT3717DWKIB,3717,378,Mike Williams,145.29333280140304,-37.13869236134871 -WT3717QUVQX,3717,378,Raymond Rodriguez,145.62713373691372,-37.196187004616725 -WT3717IPOUJ,3717,378,Carole Diliberto,145.29745211016086,-37.32235452582552 -WT3265TGYJP,3265,655,Fernando Spence,142.60851730446618,-38.077342728842595 -WT3265FDRMI,3265,655,Anthony Colon,142.88505696453913,-38.059164845297275 -WT3265AKLOT,3265,655,Nanette Murray,142.77077580742395,-38.149275103330446 -WT3265GYEAQ,3265,655,Chandra Le,142.60073204650038,-38.28789824374261 -WT3460LWSIY,3460,427,Caitlin Thompson,144.1376624005498,-37.30864007574308 -WT3460HCAZF,3460,427,Raul Taylor,144.08941044452567,-37.32284358995993 -WT3460HSJMZ,3460,427,Susan Smith,144.19283622829303,-37.37123650833884 -WT3460QYPZU,3460,427,Sonia Smith,144.0929025570156,-37.33553746695268 -WT3460SQGST,3460,427,Lawrence Troyer,144.1335916035009,-37.29758208356775 -WT3460YLOEY,3460,427,Annette Wyckoff,144.14883087817967,-37.37592921512407 -WT3960XUPWM,3960,2474,Herbert Harding,146.421896745783,-38.56082923796351 -WT3478NOSNX,3478,614,Mary Wooster,143.190083774406,-36.70864776402552 -WT3478BKYFZ,3478,614,Cristi Wetzel,143.13487923201885,-36.63308167121733 -WT3478DPGUK,3478,614,Soledad Seward,143.26754985570844,-36.88219170892449 -WT3478CBJTX,3478,614,Walter Robichaux,143.30067747372127,-36.79402421918099 -WT3463YMKAQ,3463,1225,Rose Lemelin,144.03588920833235,-37.01825568547842 -WT3463WLBBM,3463,1225,Catherine Schoonover,144.1844949063334,-36.98546058925213 -WT3608QIPDQ,3608,2418,Sarah Carabajal,145.2922659688898,-36.87430114139095 -WT3438CQCDY,3438,2387,David Stallings,144.586903151697,-37.446514751709444 -WT3621BVNYS,3621,2368,Wendy Louder,144.93731254161733,-36.131357555394445 -WT3090YMXMC,3090,1182,Laurie Hoppe,145.10432370123303,-37.656224265693986 -WT3090WEYIC,3090,1182,Jeanette Longmore,145.1123887007391,-37.68035572698927 -WT3812PLMLE,3812,770,Richard Suggs,145.57000321394543,-38.15138732269093 -WT3812XETYP,3812,770,Evelyn Wiseman,145.52655043632882,-37.989869951921904 -WT3812JQWAR,3812,770,Evelyn Owens,145.5275783506644,-38.12569037324767 -WT3373DXBDC,3373,573,Michelle Blind,143.4011825913708,-37.53673475574405 -WT3373HEMID,3373,573,William Gordo,143.13551462862847,-37.443289292032226 -WT3373ZJBZG,3373,573,Helen Hu,143.40004730403342,-37.327257624451846 -WT3373FDEUM,3373,573,Phyllis Hegyi,143.19424925274458,-37.38771716562931 -WT3814AGEVJ,3814,751,Kelly Turner,145.675337380621,-38.140210095424855 -WT3814OVCAP,3814,751,Donna Kester,145.66728248121504,-38.07119647817931 -WT3814SZYBR,3814,751,Byron Needham,145.6460050878868,-38.146876218389096 -WT3847RJDXL,3847,2191,Pat Burgess,146.86381739995323,-38.14386715522482 -WT3758GCVZS,3758,1090,Patricia Tiller,145.05303811607297,-37.37848946997211 -WT3758DJMSW,3758,1090,Christopher Allen,145.07570994771004,-37.371226033041694 -WT3638KIKMI,3638,691,Helen Keeley,145.2960240784953,-36.004820704107786 -WT3638XYYRG,3638,691,Craig Borman,145.18508840410325,-35.91762676338385 -WT3638OJFZH,3638,691,Marco Roberts,145.2057899755399,-35.96325643047504 -WT3440LHTRC,3440,2040,Candace Sutch,144.51033301855105,-37.40338784269493 -WT3096GCQVQ,3096,980,Michael Canclini,145.1909666670253,-37.64870481664699 -WT3096KTMPT,3096,980,Roberto Moncrief,145.18905739417752,-37.67924845022556 -WT3458TDFZR,3458,972,Cynthia Yu,144.37057972703673,-37.5430928247561 -WT3458FSKZU,3458,972,Eugene Henry,144.40088295549785,-37.45682082060834 -WT3515HIKOU,3515,1944,Evelyn Alcala,144.13527329174417,-36.86696311522371 -WT3501INFDS,3501,970,Dan Newton,142.12459109318573,-34.98177118462669 -WT3501XTYVM,3501,970,Brandy Lard,142.5152177429413,-34.87782592786268 -WT3749WLSOZ,3749,944,Betty Garguilo,146.8086945461124,-36.39710610515253 -WT3749WOROF,3749,944,Joseph Frost,146.84917800445172,-36.337092913340356 -WT3885EGHSP,3885,935,Karen Croley,148.48619319329754,-37.187550934582305 -WT3885TPBJO,3885,935,Lois Jones,148.2592600503724,-37.30244454304162 -WT3480QEOMO,3480,618,Ethel Priem,142.79101191322778,-36.49144056495796 -WT3480HSGMP,3480,618,Pamela Sagraves,142.71248613141526,-36.36060974795042 -WT3480GVRDF,3480,618,George Duncan,142.99418175789054,-36.20726079107059 -WT3823TUJXY,3823,919,Dianne Moore,146.11274477795862,-38.205813313194334 -WT3823IJDAQ,3823,919,Harvey Luce,145.996146854936,-38.3093020930862 -WT3707PYCEU,3707,918,William Payne,148.0126149180994,-36.827066656604 -WT3707TDXBB,3707,918,Stephen Kelley,147.92956417771916,-36.525039945910116 -WT3675CGSWG,3675,902,Sandra Holland,146.08960006289036,-36.49929801269455 -WT3675UTKNU,3675,902,Joseph Perkins,146.18864295305394,-36.27398783597474 -WT3370QYSHJ,3370,356,Paul Padilla,143.83477274787955,-37.283037043706784 -WT3370KWSUP,3370,356,Anna Thornton,143.8418718265147,-37.31545114597499 -WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 -WT3370MSMOW,3370,356,Mari Delgado,143.8089779196874,-37.182938473474394 -WT3370DKBYO,3370,356,Marsha Lafontant,143.92452478216035,-37.32455602225237 -WT3673HXZDV,3673,346,June Matteson,145.99560167654946,-36.51826050506983 -WT3673LHTGB,3673,346,Casandra Rodriquez,146.02864301781875,-36.57846222401271 -WT3673UDUWK,3673,346,Gertrude Charpentier,146.064080962777,-36.511711112290506 -WT3673IJRGA,3673,346,Tanya Boteilho,145.97689883082307,-36.70047256228652 -WT3673KVXLO,3673,346,Victor Haile,146.07246915022156,-36.42624843930229 -WT3610MARUH,3610,1712,John Cusumano,145.24019365423268,-36.65840158975186 -WT3831YJUPB,3831,1702,Scott Veliz,146.00129171085706,-37.97936717756665 -WT3281EZDKH,3281,1699,Barb Alton,142.45791213214864,-38.324298992639996 -WT3341XDEDB,3341,1663,Bernice Horner,144.29663463772837,-37.547884095619004 -WT3943EYMAH,3943,398,Sarah Lugo,144.72331044507223,-38.34139968469118 -WT3943KMLNK,3943,398,John Altman,144.72863720419917,-38.35664412958081 -WT3943FFEHH,3943,398,Floyd Mcfaul,144.7219219690698,-38.32665967904324 -WT3943HZQVK,3943,398,Alfred Turner,144.72713263386783,-38.36231659526328 -WT3091FDFST,3091,1588,Rebecca Stancliff,145.12240125110986,-37.635405529674266 -WT3272EWWHF,3272,769,Roger Anderson,142.71401463123493,-38.038851279666154 -WT3272BKXQG,3272,769,Lisa Sharpe,142.87016774545785,-37.88947223980726 -WT3763VATKY,3763,1536,Paul Taylor,145.33572339168677,-37.5146098951901 -WT3987SSZNL,3987,763,Eddie Rodriguez,145.61566941393843,-38.34242759790382 -WT3987IUCAW,3987,763,Nicole Jordan,145.6632481473161,-38.312568530431655 -WT3937DRRVK,3937,762,Tena Colicchio,145.00744278357038,-38.40617376495124 -WT3937YBAGH,3937,762,Tyesha Evans,145.0385876851752,-38.37262744294901 -WT3786EFOMB,3786,506,Donald Thomas,145.34487882758629,-37.874609030786985 -WT3786QKGRU,3786,506,Joe Pulaski,145.33261178176102,-37.876147897332174 -WT3786NFEXM,3786,506,Valarie Ladd,145.33896749059468,-37.86280807124825 -WT3321SLUNV,3321,759,Kim Olenius,143.98429332391092,-38.13055706695252 -WT3321FSNXX,3321,759,James Mcintosh,144.00220559674338,-38.10453080180178 -WT3904PAGSD,3904,1449,Joseph Guers,147.8814230103012,-37.85756287851035 -WT3097XJCTL,3097,288,Patricia Radune,145.18364275759183,-37.71865897605492 -WT3097RLMTE,3097,288,Lois Vranicar,145.18340474023532,-37.691368332589334 -WT3097ZVIBG,3097,288,Timothy Long,145.227096255893,-37.689580404553084 -WT3097QGSQV,3097,288,Michael Leedom,145.22873765767582,-37.66981369714856 -WT3097XAVZR,3097,288,Shelby Harlow,145.25409838935127,-37.72006745411789 -WT3517QWJOG,3517,710,Sharon Smith,143.824028691537,-36.45599339449958 -WT3517YLCTS,3517,710,Andres Stringer,143.9658753397074,-36.528924885229124 -WT3283LERNB,3283,1361,Robert Boyd,142.41367175900947,-38.3036671283345 -WT3669LSORM,3669,334,Patrick Thomas,145.6479454315831,-36.432169618935255 -WT3669OUWTC,3669,334,Terry Shirley,145.69151489086724,-36.46735851543632 -WT3669WHCWK,3669,334,Roxanne Fraley,145.9451171985405,-36.701771376792436 -WT3669MKTAQ,3669,334,James Fonville,145.55145500006822,-36.60076811195746 -WT3441YNOKN,3441,1335,Cynthia Collman,144.57328440300623,-37.40159541228774 -WT3211MCZAU,3211,440,Gary Ponce,144.41026041034422,-37.94191633053165 -WT3211QYZTL,3211,440,Tom Shaver,144.37026865605213,-37.917644151712125 -WT3211WIQQD,3211,440,David Cross,144.52883112609675,-37.86741720379371 -WT3518SVOUH,3518,1306,Mindy Degeorge,143.59564436938143,-36.16549139553198 -WT3525PNKTT,3525,433,David Maxwell,143.51297721469035,-36.23605115989298 -WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 -WT3525SFNVO,3525,433,Arthur Raisor,143.66354165987724,-36.267518688911686 -WT3490QZBIL,3490,1293,Eldon Thompson,142.0920751388341,-35.6294349028439 -WT3231VKTTU,3231,418,Karl Evans,143.99174248566703,-38.47241568127852 -WT3231LJTGE,3231,418,Jeffrey Yeary,144.01750189333376,-38.47277891942741 -WT3231YSKOO,3231,418,Leontine Mcghee,144.07128861030645,-38.416049306559025 -WT3767ILZMN,3767,1251,Maryann Kay,145.33373257999517,-37.853257590233525 -WT3795WSZUM,3795,1246,Alex Hawkins,145.4072514306909,-37.82187487192302 -WT3766LGYUJ,3766,619,Carol Macduff,145.40485438162457,-37.81390686762836 -WT3766LYICC,3766,619,Gary Evans,145.3953639008541,-37.81880414343826 -WT3641BTUYG,3641,1238,Lamar Lozano,145.34836367023766,-35.8424059383367 -WT3688ZTAMY,3688,618,Roberta Brown,146.64108713010882,-36.21921388508445 -WT3688CBCFE,3688,618,Benny Cook,146.81185337352275,-36.15314574756163 -WT3381NFBPE,3381,151,Daniel Acosta,142.57351080319467,-37.04393698486994 -WT3381EFBIQ,3381,151,Dale Garcia,142.46965139909298,-37.05217061975479 -WT3381APGKW,3381,151,James Larsen,142.77985200882904,-37.01354991648296 -WT3381LWKCT,3381,151,Le Gomez,142.51840302060043,-37.258945692835056 -WT3381FUDIA,3381,151,Penny Carrier,142.7602629758581,-37.02897861269415 -WT3381FKFEZ,3381,151,Elmer Griffin,142.44911391594928,-37.02476536916137 -WT3381JVYWT,3381,151,Sandra Chevarie,142.40497301204525,-37.307592633147635 -WT3381KVHUF,3381,151,Margaret Fox,142.49653441432633,-37.19416819289613 -WT3301HQZAE,3301,605,Kim Keane,142.07239211135584,-37.77700323607221 -WT3301IQFNG,3301,605,Steve Rone,141.75627170931074,-37.68817872288948 -WT3285WNGGS,3285,1207,Ora Clifton,142.14470166633348,-38.314831012426886 -WT3467JKMEF,3467,397,Manuel Abnet,143.4924702806275,-37.15209600675481 -WT3467QUKAH,3467,397,Amy Robinson,143.47318345426046,-37.11545995836594 -WT3467LHHIZ,3467,397,Richard Griffin,143.50261220117957,-37.088347582968815 -WT3462DADMQ,3462,1173,Nancy Campbell,144.1374812658229,-37.131271621789665 -WT3959PMBNZ,3959,1151,Vicki Lee,146.0821758736516,-38.66933499929393 -WT3699BGPTB,3699,562,Thelma Williams,147.21459978695535,-36.82083098907771 -WT3699OPGQD,3699,562,Barbara Nguyen,147.1863486785373,-36.846367157772164 -WT3232GSLYH,3232,1114,Joshua Sickafoose,143.96111969797116,-38.544885004427805 -WT3933UXXXP,3933,549,Shaun Guffey,145.11706009902144,-38.26228415412558 -WT3933WXYJR,3933,549,Zachary Goza,145.07665783689336,-38.27000418539565 -WT3882QOVKL,3882,365,Debbie Boulos,147.77884723369948,-37.81310504617672 -WT3882ISHVI,3882,365,Shawn Muzzy,147.7937207999227,-37.840668321486035 -WT3882RGSSA,3882,365,Phillis Schuch,147.75579639334276,-37.856665808632705 -WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 -WT3701XMJIG,3701,269,Mark Hicks,147.26723354921847,-36.1746908422996 -WT3701TPSEH,3701,269,Grant Kennedy,147.41241338695838,-36.74234154193107 -WT3701BLODZ,3701,269,William Spann,147.34749326796666,-36.82949780524 -WT3662ATDOV,3662,1078,Paul Ellis,145.08873224471094,-36.99108812380201 -WT3740IECZM,3740,1072,Michael Perez,146.9217522241385,-36.64629473417421 -WT3664SWXIM,3664,535,Marty Irons,145.4213559345688,-36.857283583008325 -WT3664EILRT,3664,535,Maryanne Lynn,145.42161318959032,-36.93788737288042 -WT3792SKYCB,3792,1065,Colby Doyle,145.39881601029296,-37.88635098026027 -WT3787KIMNH,3787,1062,Betty Sampson,145.36358060721886,-37.859543841581385 -WT3759ICVDE,3759,1062,Iva Molnar,145.23297999967573,-37.626872567426965 -WT3537EGSDE,3537,521,Laurie Martines,143.50920947939483,-35.998732241775734 -WT3537GDZFE,3537,521,Sherry Peake,143.56406500234263,-36.06556086383777 -WT3312BCEJQ,3312,1031,Alexandra Ratzlaff,141.38649875710092,-37.85213620536482 -WT3446VQPAV,3446,512,Cassandra Adami,144.41009345156795,-37.21333938617653 -WT3446LXAKM,3446,512,Maria Lyons,144.40737884448492,-37.18383196399772 -WT3713OZEIC,3713,1024,Ann Salinas,146.01557433114024,-37.27115481963977 -WT3332FSCDK,3332,338,Henry Kirkpatrick,144.15091810265923,-37.97466704460513 -WT3332WMOFU,3332,338,Ramon Clark,144.15772536670477,-37.92915238792948 -WT3332VSYVL,3332,338,Charles Koons,144.08742265383532,-37.906318691909874 -WT3988UFLKM,3988,999,Gregory Dugue,145.83757759657212,-38.26137977472963 -WT3640IJEAX,3640,498,Craig January,145.5623845411036,-35.9526679524584 -WT3640AAQGU,3640,498,Carl Ivory,145.48523912123903,-35.955725710715924 -WT3371TKLWD,3371,198,Rosie Balmes,143.780979766201,-37.140381147308865 -WT3371LQPJM,3371,198,Charles Guthrie,143.5878223789721,-37.27909863207194 -WT3371NRCNH,3371,198,Carlos French,143.54129436868953,-37.19169269131555 -WT3371EDHJW,3371,198,Maria Mccormick,143.6987549405334,-37.15966454310564 -WT3371FSXOU,3371,198,Stephen Fuger,143.58227223810064,-37.22182937861386 -WT3856LZQQX,3856,494,Harold Clark,146.5747956840559,-38.097273979739455 -WT3856VWUCE,3856,494,Calvin Peters,146.66966584752493,-38.0660779657233 -WT3822UTLBA,3822,328,Martha Cantell,145.97078430963745,-38.259788295528516 -WT3822ZUESE,3822,328,Vera Trujillo,145.9732567826071,-38.19320356727584 -WT3822SCXUE,3822,328,Olivia Kealoha,146.0445194647736,-38.21652931863321 -WT3294HMRGS,3294,959,Donna Hunt,142.41033479433978,-37.72739513117154 -WT3558YVRNF,3558,913,Shirley Mercier,144.46934774099876,-36.38961409239029 -WT3390MNEYB,3390,910,Russel Oneal,142.36556277404844,-36.671526631248994 -WT3929QUHGX,3929,301,Reta Dear,144.98217411069476,-38.478207718155254 -WT3929CVLPY,3929,301,Teresa Lombard,144.99612255072378,-38.4979018760139 -WT3929GAEUY,3929,301,Peter Boucher,144.99946764003946,-38.49461270629174 -WT3623KCHIQ,3623,224,Melissa Nunes,144.99128880433005,-36.493622465866466 -WT3623WHBOP,3623,224,Bonnie Griffin,144.86245373284606,-36.474061581880534 -WT3623CXKIC,3623,224,Rebecca Lara,144.90863570166192,-36.44103547317975 -WT3623PQJJL,3623,224,Brian Rivera,144.93257396622488,-36.45881766189839 -WT3483GYMPZ,3483,889,Shelia Atchity,142.93205811082646,-36.05104462124199 -WT3614FEUFX,3614,294,Linda Horne,145.30264231019854,-36.4423853259039 -WT3614TGMTF,3614,294,Thomas Hewitt,145.35183639969586,-36.454342723111374 -WT3614RPLDA,3614,294,Wendy Allen,145.33384555608592,-36.4847281162463 -WT3448IZIRK,3448,219,Danny Warden,144.42675511297,-37.1004559272066 -WT3448TCXAB,3448,219,Alvin Christensen,144.46845561469266,-36.99469651360088 -WT3448ARUDG,3448,219,Rebecca Gunn,144.2952391849277,-37.02554168504665 -WT3448QJBPL,3448,219,Nancy Bourgeois,144.4400794084072,-37.02794896145388 -WT3859EZZZF,3859,417,Mario West,146.874863527595,-37.938145839726175 -WT3859ROSCD,3859,417,James Kraft,146.81360775199434,-37.88569149405884 -WT3586GOKYH,3586,165,Susan Franca,143.4114445342641,-35.34326592695904 -WT3586UIYSX,3586,165,Susan Brown,143.57551704336663,-35.43013773186777 -WT3586DQTFQ,3586,165,Gail Snover,143.52329381464426,-35.414334958371455 -WT3586VLTHI,3586,165,Daryl Harrell,143.76386533809153,-35.382522017008526 -WT3586HJCAB,3586,165,Jon Pugh,143.77782006156744,-35.39881527530966 -WT3242RMIRO,3242,828,Mary Schmidt,143.9191635258242,-38.39211400505958 -WT3575LOVVV,3575,811,Bernice Crislip,143.8999537630559,-36.06222052471251 -WT3563ASTZV,3563,808,Donald Cressey,144.50286713872708,-36.253027303203616 -WT3379FSQNH,3379,803,Alvin Mccary,142.61984441180218,-37.452582014092336 -WT3557JZEBK,3557,785,Gina Jennings,144.61554898220922,-36.65260697492854 -WT3424UWBOM,3424,769,Lester Schneider,141.75360935510537,-35.60080608600458 -WT3289ZSWDS,3289,378,Kim Hall,142.1760506248015,-37.83343114690931 -WT3289KLENK,3289,378,Scott Paxson,142.28573388657216,-37.83036916681455 -WT3570CVYRO,3570,753,Lynne Mcduffie,144.27083702467118,-36.56979567964781 -WT3903XNRPU,3903,375,David Chaffins,147.83349993193158,-37.77168886119082 -WT3903AHDFU,3903,375,Alvin Alston,147.8407936942637,-37.81399186326522 -WT3221FUGFU,3221,749,Ebony Greer,144.20712718877473,-38.181166391894756 -WT3269FLZCI,3269,730,Sheila Mittler,143.10357781739555,-38.68274455859186 -WT3618RGICZ,3618,679,James Stratton,145.1127245252079,-36.372828222096814 -WT3521QXPYY,3521,165,Mary Carrasquillo,144.82504468668296,-37.05788569846151 -WT3521WLRVZ,3521,165,James Greenhalge,144.88270784822402,-37.10383461348541 -WT3521GHFHW,3521,165,Angela Jones,144.8091641663201,-37.051119435689564 -WT3521LJVFX,3521,165,Dale Cruz,144.82351825298568,-37.05283262770906 -WT3728VTOCE,3728,318,Michael Figueras,145.8609999063205,-36.148397616739054 -WT3728YZARW,3728,318,Heather Cummings,145.8168813215635,-36.115027477064245 -WT3633ADDYP,3633,201,Deborah Martin,145.45189447672618,-36.32463899149619 -WT3633WGRXB,3633,201,John Miller,145.48023893751045,-36.2875408553956 -WT3633UVHAO,3633,201,Michael Price,145.51505172180683,-36.31027112244356 -WT3637QUAPC,3637,198,Ronald Gibbs,145.24933488454735,-36.07351008853829 -WT3637KIERO,3637,198,Robert Dow,145.25553090556156,-36.0980796504903 -WT3637KCRBJ,3637,198,Dana Johannes,145.32391744928637,-36.06210732031904 -WT3646ODVHA,3646,292,Cole Garcia,145.72326135638744,-36.3884929080724 -WT3646YIARV,3646,292,Howard Adams,145.77244775588534,-36.106477847410545 -WT3392VMHPA,3392,193,Joe Howland,142.70728416780486,-36.424373130494224 -WT3392RTNTS,3392,193,Patricia Duke,142.52997970845823,-36.51024904610308 -WT3392CNJDX,3392,193,John Kruse,142.519200725167,-36.43207553003609 -WT3697NJLRT,3697,574,Lorene Adams,147.23509092899965,-36.704761090934205 -WT3063WZIQE,3063,114,James Miller,144.81061694155076,-37.553501843305575 -WT3063NRXLC,3063,114,Mildred Emery,144.85870579519653,-37.631183636401495 -WT3063BAQSG,3063,114,Kerrie Muirhead,144.8477001027189,-37.61411556432888 -WT3063SHXWL,3063,114,Jacquline Gaines,144.81431667022454,-37.548448007191524 -WT3063QANBA,3063,114,Andres Hargrove,144.8675269613745,-37.63311112075561 -WT3670PLGJW,3670,286,Amanda Rances,145.8543049782779,-36.550195914629086 -WT3670UZILW,3670,286,Alice Mount,145.90035402413275,-36.755461658470594 -WT3720INUUX,3720,142,Lydia Wake,145.85093034310947,-36.99680023507143 -WT3720MGCOZ,3720,142,Ronald Geathers,145.92574211977552,-37.04513194445374 -WT3720QRVEC,3720,142,Jason Martinez,145.94225200441355,-36.97990296994957 -WT3720PRDQD,3720,142,Brittany Figueroa,145.8909095827922,-37.08158784283176 -WT3334SWQXD,3334,141,Leslie Wilson,143.93533026459232,-37.82415532680082 -WT3334GGKOS,3334,141,Elizabet Benson,144.1621690362788,-37.67891238372265 -WT3334ZGRIM,3334,141,Danielle Aguilar,143.93613908439136,-37.71479341440412 -WT3334URENZ,3334,141,Laura Cooley,143.97291721158282,-37.70444310411927 -WT3874BQSHG,3874,558,Danny Davis,146.8929785569054,-38.63429799594603 -WT3566XFFVH,3566,275,Katherine Rances,144.38029622131242,-35.94210216676543 -WT3566TZUNA,3566,275,Jane Riherd,144.27256575931622,-35.96498437670641 -WT3384SCVXJ,3384,547,Mattie English,142.82570937595798,-36.86424828187021 -WT3594VFWKC,3594,265,Maria Wyatt,143.36980614046337,-35.13689286142818 -WT3594HMRHI,3594,265,Regina Stevenson,143.36144293860465,-35.139081004061744 -WT3324PZTHD,3324,529,Ray Hunt,143.37848595547797,-37.83035948043598 -WT3314MSPDH,3314,262,Kristopher Dillis,142.49428100466025,-37.42945996656578 -WT3314MMCAP,3314,262,Brenda Hier,142.24619966833797,-37.241569389454305 -WT3251FUJSG,3251,522,Lisa Voegele,143.5797389397756,-38.1623931117428 -WT3385SBYHN,3385,517,Jose Muscarella,142.4769673818804,-36.72879804542957 -WT3966FVIXR,3966,511,Nicholas Jones,146.3860642910803,-38.632532172146895 -WT3944IPDXM,3944,510,Bea Perkins,144.69467580157874,-38.30821085492802 -WT3711ZTDQC,3711,492,Michelle Henkel,145.72069644231422,-37.38843622880619 -WT3276GCLGU,3276,482,John Malbon,142.4392854535207,-38.19894008452885 -WT3695LTWEX,3695,471,Brian Manson,147.12812637330472,-36.43015576164423 -WT3622PSQCL,3622,457,Michael Johnson,144.86970237771936,-36.28586503033871 -WT3744AERRG,3744,453,Wanda Winger,147.02260359868137,-36.843450219388366 -WT3865KWBMJ,3865,449,Danielle Zeigler,147.47135719889891,-37.7878966294349 -WT3649NJHAF,3649,86,Catherine Ortiz,145.70444412227315,-36.12591041370753 -WT3649FZBJW,3649,86,Randy Reis,145.71663028775822,-36.09467058803647 -WT3649QHCBG,3649,86,Catherine Martinez,145.7410820492848,-36.08027704542416 -WT3649VOFAD,3649,86,Robert Stephenson,145.73206798467282,-36.091294892789826 -WT3649HAFSM,3649,86,Pauline Moye,145.70978060583693,-36.016821302693344 -WT3287GNYUZ,3287,216,Gregory Robertson,142.22590342509568,-37.982341386004684 -WT3287NEKVB,3287,216,Joel Simmons,142.26305043381535,-37.983480961999916 -WT3239MBYZA,3239,212,Richard Ashby,143.47124816171566,-38.500937875544096 -WT3239YKAGQ,3239,212,Juliet Squires,143.44503520183875,-38.600327542945436 -WT3407PYOAR,3407,420,Gale Martin,141.83324586447986,-37.2859635851256 -WT3597QYEPE,3597,138,Bill Boardman,143.05015816797393,-35.057893670531236 -WT3597EWQEE,3597,138,Barbara Prater,142.93959851974742,-34.79055186433574 -WT3597ERXFD,3597,138,Jeffrey Wassermann,143.05218418696776,-34.748219582967735 -WT3954ZMCUG,3954,404,Virginia Craig,145.94579609352263,-38.592514028809966 -WT3779GWEUZ,3779,197,Heather Hamilton,145.95958275948624,-37.592625406209436 -WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 -WT3886ESDHQ,3886,194,Grace Cheeseman,148.468952000646,-37.74203564053428 -WT3886TTZGX,3886,194,Andrew Gallaher,148.45433415685554,-37.76042025038381 -WT3302YQSRD,3302,371,Janet Wuertz,141.70903116268366,-37.77041636441886 -WT3760NWWQM,3760,123,Christina Barnes,145.2537632355421,-37.61222515067956 -WT3760NSMCA,3760,123,Dave Harris,145.27915408932998,-37.62392370581628 -WT3760OIPAO,3760,123,Donnie Washington,145.28420018561462,-37.60539948948486 -WT3719TVVJM,3719,122,Brent Bautista,145.6864773045679,-37.03188286944955 -WT3719OORYW,3719,122,Basil Perkins,145.58228061500017,-37.04599105764248 -WT3719HLABD,3719,122,Alfred Too,145.52985920519603,-36.964844896202216 -WT3395ZFRTI,3395,364,Eileen Smith,142.22894607727852,-35.890065275630576 -WT3588WVCMU,3588,356,Lester Buford,143.4217950256489,-35.299755264328425 -WT3475CCCXF,3475,172,Laura Martin,143.57488363090826,-36.85185108205203 -WT3475GQDOE,3475,172,Stacy Tatsch,143.46966058558894,-36.668195411179134 -WT3319JVPPC,3319,344,Brian Beebe,141.22543417362317,-37.012182939250735 -WT3887NLNSJ,3887,342,Lorene Anderson,147.96080438424718,-37.76269836557282 -WT3522OQJSC,3522,169,Michael Walston,144.74940885106298,-36.97742678178455 -WT3522OJRGT,3522,169,Kathy Wilkerson,144.74300595564944,-36.97382390728314 -WT3573ITNEH,3573,111,Sarah Batts,144.4134357014596,-36.25351364792508 -WT3573DPVGU,3573,111,Wiley Palmer,144.15009214850954,-36.12318035418112 -WT3573USMYF,3573,111,Mamie Jimenez,144.47307368498045,-36.29128543237728 -WT3890YMWXJ,3890,324,Floyd Lopez,149.26497677490372,-37.448441010677136 -WT3873DKJEX,3873,80,David Whitaker,146.6834436511048,-38.27461997132981 -WT3873TVISD,3873,80,Joseph Richard,146.74366652248028,-38.24447649607425 -WT3873ESEXR,3873,80,James Nardone,146.73243514870416,-38.26862296306848 -WT3873JWNLL,3873,80,Philip Sanchez,146.76425315494552,-38.248738772189654 -WT3979RQAKR,3979,160,Joe Wilson,145.63102371227131,-38.49742283359791 -WT3979UJRXF,3979,160,David Behrens,145.61944713831397,-38.42753872026658 -WT3430SRBOM,3430,320,Deidre Blain,144.717823619539,-37.45002826162372 -WT3571ITSUB,3571,318,Francis Orphey,144.16883497681675,-36.34875486142471 -WT3387TTBDC,3387,312,James Cunningham,143.01913490844026,-36.98457015456603 -WT3254RXAVL,3254,310,Amy Pugh,143.54387071993327,-38.308515316326016 -WT3833BOMRB,3833,307,Margie Green,146.11666404368856,-37.95726898277424 -WT3293SQKBY,3293,100,Shawn Clark,142.64808203542347,-37.82556647618436 -WT3293OKFUP,3293,100,Linda Cook,142.64917955102206,-37.68950303741661 -WT3293BUTCN,3293,100,Micheal Henriquez,142.41365868994518,-37.73003361911264 -WT3412EUBAQ,3412,149,Cynthia Nicoletti,141.52249483530403,-36.79192850555632 -WT3412CTRWX,3412,149,Ashley Bentley,141.42125500515377,-36.6188353776219 -WT3709NIYXZ,3709,145,William Stevens,147.82220549758904,-35.997592594813014 -WT3709SKIHY,3709,145,Johnetta Jackson,147.58945926383643,-35.98810924750853 -WT3468HOPGM,3468,286,Melissa Cole,143.46879167665466,-37.2505147471354 -WT3329YEZVS,3329,142,Nina Johnson,144.00191832187895,-37.91819500282096 -WT3329RYDXT,3329,142,Dean Hicks,143.87956511815653,-38.03900204899043 -WT3562YUGDU,3562,279,Micah Rodriguez,144.4588804257186,-36.05511756014117 -WT3310PQUBW,3310,276,Bessie Simons,141.48832395314227,-37.74358845249581 -WT3958YCZYE,3958,272,Wm Denton,146.02010324860865,-38.69545657583797 -WT3789TMNJY,3789,265,Roger Spencer,145.35001082455108,-37.876336921811706 -WT3755OIDFJ,3755,252,Diana Taylor,145.1535820920967,-37.55849215079668 -WT3270DXNQH,3270,123,Sabrina Brantley,142.86652199719225,-38.552328853487055 -WT3270VYPYQ,3270,123,Raymond Sutton,142.8318286564251,-38.61411835259919 -WT3832NHOOV,3832,247,Bryan Warren,146.0154412945935,-37.93424551655733 -WT3738LQTCS,3738,219,James Wareham,146.77993124287363,-36.57772232481024 -WT3238BOTYW,3238,72,Bernard Jackson,143.567776369521,-38.625836774939955 -WT3238EGMOA,3238,72,George Brown,143.33872080562963,-38.799580856292664 -WT3238MCUPV,3238,72,Nellie Banks,143.56196753560545,-38.82942446565583 -WT3330SFSQV,3330,217,Alyssa Johnson,143.80666515091974,-37.972463547396835 -WT3864DBQMJ,3864,217,Geraldine Martinez,147.35297667088736,-37.92523989104278 -WT3733ZRFXX,3733,215,John Horton,146.43418373847857,-36.78838281077019 -WT3237XOZIG,3237,107,Barbara Watson,143.62294302711948,-38.700688751493466 -WT3237WECQF,3237,107,Pedro Mcleod,143.69206910321378,-38.75856130842859 -WT3583QHCKS,3583,209,Cynthia Brewer,143.66859933252738,-35.5299230143342 -WT3946JOFXE,3946,104,Jan Goodrich,145.7192956876138,-38.43764463690359 -WT3946CHDDQ,3946,104,Mary Johnson,145.78267527312724,-38.43639382834139 -WT3375ORFQU,3375,104,Heidi Limon,143.26000015058494,-37.45880281030328 -WT3375LAJLR,3375,104,Emma Boatwright,143.2980117885972,-37.372200644973155 -WT3292RYQHY,3292,190,Neal Martenez,141.21340675084443,-38.13998929798788 -WT3234WWIFA,3234,90,Latanya Hurst,143.75317875173945,-38.613627563528 -WT3234FPGRT,3234,90,Erin Sanchez,143.87128178598107,-38.70268409082685 -WT3391MXURJ,3391,171,Vivian Holmes,142.5847058735757,-36.06961633939022 -WT3581BHSJW,3581,56,Paul Peterson,143.7535102911311,-35.54628594217159 -WT3581ARKZP,3581,56,Michael Auerswald,143.82631327926745,-35.554401104359 -WT3581IXSCV,3581,56,April Long,143.84395469583112,-35.58177315955131 -WT3572UOOQX,3572,75,Britt Williams,144.30582272820246,-36.3147946744435 -WT3572QKNMX,3572,75,Bobbie Alexander,144.23297168893794,-36.37549543758321 -WT3900UYGLE,3900,149,Denise Russell,147.5972713074322,-36.73959902169322 -WT3273HFRKB,3273,143,Annie Hastings,142.68415340600552,-37.993411346930365 -WT3491DTDPG,3491,133,George Olsen,142.19708518735555,-35.5526826141909 -WT3599BUOIB,3599,33,Angela Jackson,143.1787280374593,-34.77449866594533 -WT3599SCILO,3599,33,Bernadette Macaraeg,143.01577439228708,-34.78811837449265 -WT3599SSPTZ,3599,33,Jack Taylor,143.2051140200742,-34.710205812295726 -WT3599DVPAN,3599,33,Rebecca Rigsby,143.19753271424213,-34.70506108206721 -WT3607QVZKZ,3607,131,Ellen Gipson,145.1609195787148,-36.82109281259211 -WT3762TBMLS,3762,131,Stephanie Gonzalez,144.88717572676498,-37.33492122205464 -WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 -WT3530IMHIL,3530,63,Doug Nunez,143.19563418135533,-35.757657382224984 -WT3309UAHAX,3309,124,Bobby Andrews,141.5652819683202,-37.83789015425547 -WT3891DIUYN,3891,35,Steven Turcotte,149.74040967732958,-37.74088000886122 -WT3891OXFAK,3891,35,Veronica Smith,149.6383698678278,-37.31385347266344 -WT3891YZEFQ,3891,35,Gary Derrico,149.4334448701031,-37.688995526090274 -WT3596HBEUF,3596,47,Jose Robertson,143.15095468769667,-35.190473662123345 -WT3596ZAMTX,3596,47,Gregory Booth,143.18925722392484,-35.14344453095626 -WT3852UXZYD,3852,46,Judy Horn,147.15539385937802,-38.114047049214356 -WT3852IRDFY,3852,46,Stephanie Stewart,147.11972466828865,-38.11059906774082 -WT3487ZDAIO,3487,46,Faye Troy,142.54705121608765,-35.6169222609149 -WT3487DIBUX,3487,46,Bette Freeze,142.55489446874185,-35.641735681282626 -WT3026TCTQH,3026,73,Richard Grosvenor,144.81637725224323,-37.821627544175726 -WT3718PAMXL,3718,72,Richard Evans,145.5172622664395,-37.168664167586044 +Watchtower ID,Postcode,Population Served,Watchtower Point of Contact Name,x,y +WT3030WFXSP,3030,16718,Adam Guess,144.6583806266531,-37.920393458737394 +WT3030EAAIV,3030,16718,Kristi Blair,144.6243406879087,-37.91670989311453 +WT3030CEWEY,3030,16718,Trina Smith,144.52820347883215,-37.9093277995756 +WT3030JVCEB,3030,16718,Louis Johnston,144.45024112491487,-37.98394994940138 +WT3030YFNAG,3030,16718,Corey Johnson,144.70361542108188,-37.92472052154974 +WT3030LTIGF,3030,16718,Rose Doyle,144.46278815338627,-38.00911872735974 +WT3029SXHHE,3029,31316,Linda Iversen,144.71296675156486,-37.86520821798988 +WT3029WTVUC,3029,31316,Betty Kinkead,144.65575178193805,-37.85023341318659 +WT3029FPTUC,3029,31316,Linda Holmes,144.64896347497066,-37.80533290563009 +WT3977GQKCK,3977,46663,Elbert Gonzalez,145.25331943044847,-38.113610331211525 +WT3977EDZMT,3977,46663,Jared Mini,145.20203781339058,-38.11829293213807 +WT3064ZSYLE,3064,75457,Andres Hinerman,144.99937422807804,-37.529604814092735 +WT3023FWWDF,3023,12794,Bruce Shelton,144.78739771947542,-37.717817040670845 +WT3023UPTGH,3023,12794,Audrey Pottinger,144.73156254752686,-37.74093124005147 +WT3023MTCLY,3023,12794,Karri Daniel,144.75885721627395,-37.79319127956608 +WT3023QBQJF,3023,12794,Sandra Jaynes,144.7116868675065,-37.79835253004884 +WT3023SNBCZ,3023,12794,Harold Street,144.74109283367372,-37.7770166374208 +WT3150RJFPF,3150,60079,Charles Mayhew,145.15558074332156,-37.880884421156225 +WT3350NKSMB,3350,59145,Robert Walker,143.79635297547784,-37.53085956944499 +WT3805LNWZK,3805,56933,Al Howard,145.32997457936534,-38.02904884185844 +WT3216YAONQ,3216,9380,Mamie Isenberg,144.3574810402222,-38.18212005541767 +WT3216RRLQT,3216,9380,Lucia Nesbit,144.26515487987933,-38.19543768887932 +WT3216JMHUR,3216,9380,Brian Funderburk,144.36188022322395,-38.18996650227888 +WT3216XCZZB,3216,9380,Joseph Fitzgerald,144.32820084704858,-38.18360092582498 +WT3216DJFMH,3216,9380,Carole Ines,144.2756956328754,-38.21314829043297 +WT3216KCMJI,3216,9380,Edward Kirby,144.35398948209195,-38.194825198185804 +WT3199YCAXG,3199,54298,Karolyn Powers,145.12150620883324,-38.14922616931948 +WT3021GOWCI,3021,10838,David Kinkelaar,144.80893593008622,-37.76038864241594 +WT3021WLVBY,3021,10838,Grace Delisio,144.76656834121744,-37.74757159362882 +WT3021ZDXUT,3021,10838,Joel Koppenhaver,144.79009590439128,-37.75656051246632 +WT3021ETLPZ,3021,10838,Bessie Britton,144.82137301024244,-37.76070759665212 +WT3021NRDYD,3021,10838,Michael Ford,144.7744197768088,-37.72333341047645 +WT3175IPFYN,3175,17765,Thomas Arrington,145.225146895528,-38.022615341752626 +WT3175NTSYH,3175,17765,Howard Hall,145.16065666389912,-38.05647092673088 +WT3175FGGWD,3175,17765,Pamela Arch,145.17941408411815,-38.07927410144703 +WT3037YAKEI,3037,25577,Paul Watson,144.7404381965215,-37.71057606210163 +WT3037PDFYE,3037,25577,Kirk Wells,144.7531908939604,-37.67923545314725 +WT3073SJWMD,3073,12618,Eric Brinton,145.00498806225505,-37.69072253860459 +WT3073KMHND,3073,12618,Cheryl Johnson,145.00457802784703,-37.702736125755365 +WT3073ONYMR,3073,12618,Mike Torres,145.00628991909576,-37.711935332631434 +WT3073PYIIS,3073,12618,Christina Drumheller,145.0391077826588,-37.722743246616815 +WT3806QYESS,3806,8086,James Escobar,145.3317722219415,-37.97440088154117 +WT3806FONGK,3806,8086,Mae Westlie,145.3474579996713,-37.99807732281171 +WT3806ZXAFC,3806,8086,Anthony Sanders,145.31703178391476,-38.043913751358616 +WT3806RWKRS,3806,8086,Helen Harris,145.38696767754786,-38.01640678680775 +WT3806RCRBI,3806,8086,Ronald Clark,145.32693996891396,-38.03540190423143 +WT3806CGOWL,3806,8086,Marx Weiner,145.3853509640092,-38.016276081953485 +WT3810RRMDP,3810,47894,Shirl Bays,145.54377380709113,-38.11642115246884 +WT3020YBMJJ,3020,14927,David Romero,144.81308271981888,-37.78017960084323 +WT3020TBHAH,3020,14927,Mark Moore,144.80793220831066,-37.78665609588704 +WT3020IKMGC,3020,14927,Zula Nagy,144.85181759620312,-37.8113734834473 +WT3136XMORO,3136,14789,Jennifer Annis,145.2610489901307,-37.776402809772044 +WT3136JFBGP,3136,14789,Luis Lawson,145.30362087169183,-37.81142513832987 +WT3136OPSQS,3136,14789,Harriett Bunch,145.25652650583658,-37.78338733774677 +WT3550MNEUC,3550,10084,Aaron Timberlake,144.34548014895424,-36.76077323665997 +WT3550WPDGF,3550,10084,Frank Hall,144.3052352950293,-36.748338469985555 +WT3550ANADF,3550,10084,Virginia Lumpkins,144.25225555806287,-36.7583657822827 +WT3550ZOAVN,3550,10084,Melinda Longoria,144.31154158895455,-36.76339563696199 +WT3174QCCPN,3174,12820,Douglas Henley,145.18170096492744,-37.962463453868814 +WT3174SVLFP,3174,12820,Linda Pena,145.19975492357466,-37.97228515371461 +WT3174RTNEX,3174,12820,Marina King,145.19624744732596,-37.94599511222388 +WT3000MGKPJ,3000,18987,Otilia Rykaczewski,144.96171181726967,-37.82148358923285 +WT3000EYYYK,3000,18987,Peter Wheeler,144.9527711985453,-37.82383328788954 +WT3754SXJZI,3754,6292,Henriette Mitchell,145.1619799395555,-37.61057382984485 +WT3754BUNNX,3754,6292,Evelyn Moore,145.1818713827351,-37.569227768847064 +WT3754XKPJP,3754,6292,Leslie Bankston,145.06810561924175,-37.57939619269055 +WT3754DQUSN,3754,6292,Ella Rohrbacher,145.12640802729558,-37.61134953804294 +WT3754YEIRW,3754,6292,Michael Etienne,145.15550588910898,-37.565289543896235 +WT3754WSOKP,3754,6292,James Lopez,145.11378037030943,-37.60927638542337 +WT3156TLXBQ,3156,9366,Rita Singh,145.24765774213373,-37.91617846922139 +WT3156OVCXT,3156,9366,Amy Fisk,145.32200244441637,-37.90336764103624 +WT3156RMYYL,3156,9366,Mark Fernandez,145.2752824080853,-37.94563359375401 +WT3156ALZRL,3156,9366,Michelle Belk,145.2691830096965,-37.946946186713696 +WT3337ZQWGM,3337,36454,Casey Dalton,144.57009093872702,-37.64370381639777 +WT3429TMHZA,3429,6049,Anna Whitley,144.70767809089992,-37.59240449257921 +WT3429AKNKO,3429,6049,Wilbur Jones,144.82859912168232,-37.484572146701964 +WT3429QUOWL,3429,6049,George White,144.70116224426192,-37.58845771833162 +WT3429OIZPS,3429,6049,Michele Mitchell,144.73405343608528,-37.535127404228675 +WT3429FPUNU,3429,6049,Jeffrey Cuevas,144.78894841217732,-37.53575805856136 +WT3429ATTSU,3429,6049,Tony Rivera,144.8264180662807,-37.53104587054532 +WT3195IOEZA,3195,35869,Hazel Seal,145.0986312566308,-38.02519988348862 +WT3046TSZCB,3046,8515,Bryan Lewis,144.95822883047236,-37.72143208152169 +WT3046SSWEX,3046,8515,Claudia Johnson,144.93901814946574,-37.71113556434513 +WT3046QLKKF,3046,8515,Brett Hughes,144.95775841721363,-37.69521413198007 +WT3046ADKBS,3046,8515,Morris Pring,144.94317380188164,-37.71659755462475 +WT3058GAJIA,3058,11259,Lillian Williams,144.95509539103062,-37.72267717416843 +WT3058QBBEK,3058,11259,Lisa Silas,144.94771633746444,-37.72431868999582 +WT3058PMYON,3058,11259,John Orlikowski,144.96606832748174,-37.72489184577246 +WT3178DBGVI,3178,5612,Mary Woody,145.24027653682384,-37.93036802368387 +WT3178ZDEXK,3178,5612,Jeffrey Johnson,145.24988561798148,-37.92452579106426 +WT3178MNYBC,3178,5612,Timothy Padilla,145.27689800066636,-37.93760826019328 +WT3178KYQIS,3178,5612,George Langley,145.22989301524538,-37.90629276174462 +WT3178XTNBB,3178,5612,Olga Hale,145.2469458149325,-37.93319171214341 +WT3178BQAJG,3178,5612,Malka Smith,145.26959423333145,-37.918875236595035 +WT3149NUQMB,3149,11203,Mary Finley,145.11936237866772,-37.85849697750271 +WT3149SEGNE,3149,11203,Cherry Winstead,145.11714700908936,-37.879722955287434 +WT3149HQJPC,3149,11203,Nancy Newton,145.12340500068873,-37.88715970761158 +WT3690NYJLB,3690,5586,Adam Peacock,146.82345449162182,-36.09577537757103 +WT3690PQEQB,3690,5586,Richard Lewis,146.8008583711887,-36.06452725826131 +WT3690FWDEV,3690,5586,Robin Hartman,146.8345476029173,-36.16246966437017 +WT3690HZOLB,3690,5586,Willie Ibarra,146.83811326729935,-36.11657609054598 +WT3690VPZWP,3690,5586,Rick Spencer,146.81201011941323,-36.12471235728671 +WT3690XHHWT,3690,5586,Susan Goggin,146.88088411123238,-36.10317012808323 +WT3152USNWQ,3152,6618,Amber Hedin,145.22798311126752,-37.85324308519963 +WT3152NPPZC,3152,6618,Mildred Farry,145.19975611484864,-37.85062021145897 +WT3152AZNOY,3152,6618,Chong Chavez,145.21497655123054,-37.853348755217 +WT3152TQIAV,3152,6618,Harold Baron,145.1947729959802,-37.877961397530655 +WT3152FHNAO,3152,6618,Craig Sloan,145.25361925996987,-37.841104574320354 +WT3072RYLDO,3072,32851,Alexandria Porter,144.99431436418755,-37.738832144703785 +WT3134DTGBI,3134,6556,Allen Sheppard,145.2209379447918,-37.76787170771994 +WT3134JYPDI,3134,6556,Virgil Thomas,145.23608291476037,-37.81778079602793 +WT3134VAQRO,3134,6556,Chase Scott,145.21359856304974,-37.82689973086141 +WT3134NJHRS,3134,6556,Odessa Eplin,145.23314454629315,-37.79085183503013 +WT3134ZAWJS,3134,6556,Elijah Becker,145.22317215067378,-37.8064861673859 +WT3500WTTCL,3500,8184,Lori Greene,142.07369486414845,-34.1840939123636 +WT3076LVYFZ,3076,32395,Larry Menke,144.96542377017286,-37.64660543487833 +WT3130PLSQY,3130,8043,Jose Hayes,145.13764760079675,-37.828083908584475 +WT3130XMUNW,3130,8043,Cathy Powell,145.13454854622512,-37.814071594790974 +WT3130RXPQD,3130,8043,Lonnie Morgan,145.14993924759943,-37.803878744622146 +WT3130MLSKB,3130,8043,Jeanine Roberts,145.15758764500598,-37.83700562668973 +WT3280BGQFC,3280,7892,Christina Myers,142.5124079508843,-38.34652485601869 +WT3280ZNNGF,3280,7892,Dorine Taylor,142.54128128335316,-38.324696399460194 +WT3280ICHQC,3280,7892,Daniel Holt,142.47256138869804,-38.37493706098152 +WT3280GVPRD,3280,7892,Rebecca Robinson,142.47231992282983,-38.374726991411244 +WT3083VQQFF,3083,31526,Michael Kelsheimer,145.02432389049392,-37.71154012686286 +WT3630PRZEM,3630,10424,Marguerite Gibson,145.64651785281362,-36.52494634109052 +WT3630FANLS,3630,10424,Christopher Pate,145.63490206002706,-36.40980123195501 +WT3630SIKVF,3630,10424,Cecilia Pipes,145.67020940336758,-36.38181728988258 +WT3551OSDGB,3551,5913,Dario Miller,143.96122388612906,-36.661100832015194 +WT3551WUHGQ,3551,5913,Julia Harris,144.59869731863023,-36.71067973693701 +WT3551HZNZJ,3551,5913,Philip Whiteside,144.47967781227192,-36.72005122642794 +WT3551EWIYX,3551,5913,Jonathan Poindexter,143.7293498074458,-36.76605272468181 +WT3551WUGIW,3551,5913,Hans Miranda,144.53333375653355,-36.56455268072542 +WT3032GFFPO,3032,7362,Richard Walker,144.8861180004496,-37.78412012672793 +WT3032OQZEL,3032,7362,Nancy Ward,144.91934959363664,-37.76385385158951 +WT3032PNVIB,3032,7362,Allen Paulsen,144.8888607257873,-37.787185777191084 +WT3032PWVMB,3032,7362,William Mackiewicz,144.87559681642185,-37.79083145310446 +WT3028EVTUZ,3028,9733,Andrew Johnson,144.76292579701328,-37.89924217348946 +WT3028RFCNS,3028,9733,Billie Sterner,144.8044209591793,-37.84913098904796 +WT3028CNGER,3028,9733,Clara Lee,144.76379179481324,-37.867551798701946 +WT3844EDHDX,3844,28980,Tammy Mayweather,146.43714530130234,-38.3229284773084 +WT3109XTNYN,3109,14180,Raymond Bates,145.15909952410618,-37.80416922449334 +WT3109HXEBH,3109,14180,Wanda Johnson,145.1797356497215,-37.78398821626665 +WT3095OIJVG,3095,27771,Jessica Kubis,145.1727846073084,-37.69925086082626 +WT3038XJJWS,3038,9087,Darlene Anderson,144.79969082513048,-37.72359514749498 +WT3038BSCPT,3038,9087,Betty Claar,144.81011749261393,-37.71275294089123 +WT3038DWSIG,3038,9087,William Bona,144.77601184740396,-37.71809767361204 +WT3044ONLDH,3044,9038,Floyd Coffman,144.93310701680394,-37.735559167663965 +WT3044KLBHH,3044,9038,Rosemary Anthony,144.94253148988213,-37.74613640034775 +WT3044ADHAA,3044,9038,Harold Farnell,144.9442552666063,-37.73555900014787 +WT3040KJDIV,3040,6484,Barbara Venegas,144.91321985340645,-37.75720619865514 +WT3040TFPXX,3040,6484,Chris Spencer,144.89110381405945,-37.76065107159642 +WT3040IFXWW,3040,6484,Lynn Ibara,144.9268397283389,-37.74233613901868 +WT3040BUQSL,3040,6484,Wyatt Shaffer,144.9305577481481,-37.75505075155941 +WT3173PDSBH,3173,5157,Grace Owens,145.1944554691889,-38.021476076736825 +WT3173LSIEZ,3173,5157,Peggy Barb,145.14547021819877,-37.992158849544744 +WT3173VYMOK,3173,5157,Theresa Taylor,145.1894158199428,-38.00003695621938 +WT3173GFZOQ,3173,5157,Donald Lozano,145.19499865506185,-37.988541644587656 +WT3173JKIEY,3173,5157,Teddy Mccauley,145.18948448769126,-37.992844271467284 +WT3084JROEH,3084,12758,Sarah Lerma,145.07262197475765,-37.750857556422204 +WT3084GWBWX,3084,12758,Sean Magruder,145.08417155444224,-37.734350005293706 +WT3196XSNIF,3196,8442,Tamika Hardy,145.11969767221726,-38.05403074423008 +WT3196IBOKA,3196,8442,Warren Morales,145.14133411912982,-38.030989105994266 +WT3196YBQPJ,3196,8442,Louise Hassan,145.11328140987263,-38.0694853367573 +WT3146HRIZE,3146,25255,Manuel Ingham,145.05369626641567,-37.85103460177614 +WT3141NAWKR,3141,4191,Byron Hutchins,144.98666929059277,-37.84030215496492 +WT3141VUIEX,3141,4191,Mario Degeorge,144.99084667596154,-37.83266855015864 +WT3141XWIRO,3141,4191,Gladys Wicks,144.9903037073295,-37.829036050601765 +WT3141DNRAR,3141,4191,Christopher Gladden,145.00656224560973,-37.83749211253639 +WT3141WNXNO,3141,4191,Virgil Johnson,144.99930264374774,-37.829664835211155 +WT3141OOGAL,3141,4191,Francine Cardero,144.98916146393907,-37.83634340602355 +WT3101MKQBQ,3101,24605,Jeffrey Boger,145.016165903305,-37.789514982505544 +WT3070NTZSI,3070,8187,Hattie Hilton,144.99056659089558,-37.782210442188045 +WT3070PKQKW,3070,8187,Joseph Lankford,145.00987281086302,-37.7854423609157 +WT3070UIAUA,3070,8187,Ruth Whatley,144.99808273178186,-37.77688407018196 +WT3056DZVPH,3056,12236,Leonard Houser,144.97434877439903,-37.76285697143965 +WT3056SINUS,3056,12236,Angelina Doten,144.97172683083915,-37.76523841709616 +WT3802EJGIH,3802,12149,Maria Murillo,145.2654996546424,-37.97535452787995 +WT3802JFIGQ,3802,12149,Judy Susanin,145.2646955403689,-37.96887524277758 +WT3752TYZVC,3752,8020,William Ortiz,145.0990082854568,-37.6354444723332 +WT3752MDIOG,3752,8020,Debbie Davis,145.0801947102152,-37.656853118884825 +WT3752DTWRY,3752,8020,Shirley Vernon,145.11190147000818,-37.63334790990493 +WT3214SDJVB,3214,23964,Linda Bradley,144.3587251337974,-38.05556887988389 +WT3024REMLK,3024,3974,Stephen Mcdonald,144.6536083470412,-37.79961713947505 +WT3024ONESQ,3024,3974,Cathy Funke,144.65670260686147,-37.823722796741066 +WT3024OCPGU,3024,3974,Ricky Lessman,144.57353810144866,-37.92203392010761 +WT3024SWHMW,3024,3974,Cathy Ellison,144.6439391487586,-37.86605458157099 +WT3024AHCQK,3024,3974,Juan Greer,144.5955079869732,-37.87742233911276 +WT3024LLIXC,3024,3974,Robert Callen,144.67160191634878,-37.843914628376886 +WT3166YKFIY,3166,11878,Jane Orsini,145.09372343453362,-37.904756037479814 +WT3166LAGWZ,3166,11878,Elayne Sledge,145.10663609744375,-37.89032675058554 +WT3122QTFAA,3122,11755,Gertrude Mak,145.02069427862008,-37.83567746306098 +WT3122GVRSM,3122,11755,William Bell,145.0366394627393,-37.810997917513916 +WT3338VUNIK,3338,23412,Christine Smith,144.61166783914862,-37.68847556394404 +WT3182RKGMN,3182,5847,Dennis Vargas,144.98595893173,-37.85381160327312 +WT3182VNNPW,3182,5847,Julia Marshall,144.9720187701412,-37.851498667714225 +WT3182XUYBI,3182,5847,Carol Jepson,144.97584577516537,-37.865621833881825 +WT3182OEGBG,3182,5847,Russell Jutras,144.9908645797452,-37.85713703728914 +WT3145ZTUAZ,3145,23295,Mary Carter,145.07990126552414,-37.88660909527147 +WT3186JHMXL,3186,7751,Bertha Amos,144.99852209269145,-37.9108921514994 +WT3186TTDAZ,3186,7751,Delores Bryant,144.9981488714694,-37.892709124542016 +WT3186NJIYK,3186,7751,Joseph Aguilar,144.991208682922,-37.913922252633924 +WT3172MPWVX,3172,23089,Kenneth Martin,145.1163803602562,-37.98036690269593 +WT3075TFZBG,3075,11297,Angel Sledge,145.00050732794358,-37.66530476286956 +WT3075PQUNW,3075,11297,Rick Walls,144.97271489310629,-37.67002288868526 +WT3910TOMTM,3910,11294,Mary Conyers,145.17078673916086,-38.157889426030216 +WT3910GHRJL,3910,11294,Mike Bonneau,145.21511761712927,-38.129955676943375 +WT3131ZPDCI,3131,5626,Michael King,145.16871648542545,-37.803152773463914 +WT3131NBPZS,3131,5626,Janet Keller,145.1825300302115,-37.81979132355934 +WT3131XGUSR,3131,5626,Annette Russell,145.1587437004463,-37.80127846325513 +WT3131QOEGH,3131,5626,Billie Rodriguez,145.17986334885012,-37.83417363952394 +WT3192WYOED,3192,22291,Earl Maxwell,145.04432071046824,-37.96332078916971 +WT3155DIOQN,3155,22195,Edward White,145.30453693175082,-37.85124767277449 +WT3133ZMXPD,3133,22125,Darrell Baldwin,145.19895331609993,-37.83550615948766 +WT3124HDVOU,3124,22094,Thomas Merritt,145.08163136507585,-37.82770547789762 +WT3138GCDHE,3138,5491,Mark Montgomery,145.32553060424883,-37.781521967351715 +WT3138DJNRN,3138,5491,Lawrence Gries,145.30073129866167,-37.78882923312574 +WT3138NYAZI,3138,5491,Michael Jurczyk,145.3498041169002,-37.79662586519823 +WT3138RHEWT,3138,5491,Thomas Ferguson,145.306922187079,-37.78348718565499 +WT3171PHQVZ,3171,7238,Cedric Harrington,145.16498083635668,-37.95579674740436 +WT3171BGAEJ,3171,7238,Lila Levy,145.1337946019459,-37.92898751855743 +WT3171MJICH,3171,7238,Juan Hinchee,145.18043282568064,-37.95879127651984 +WT3011IQUNX,3011,7154,John Brown,144.89846041943312,-37.791085279625314 +WT3011UJIUE,3011,7154,Dixie Howell,144.89553897499536,-37.81371642915031 +WT3011EAEZY,3011,7154,Kenneth Carroll,144.877915863424,-37.80663443631112 +WT3340BDCGH,3340,21121,Paul Allison,144.40532457643525,-37.81327394581011 +WT3047DGPRJ,3047,10451,Tomas Mcguffee,144.92699546794756,-37.68255313490852 +WT3047ORCUE,3047,10451,Steven Amundson,144.90328678358944,-37.69247885083065 +WT3108XXEQC,3108,20826,Ashley Mangone,145.11485742234592,-37.79528171594063 +WT3201RUASD,3201,20711,Rose Williams,145.1534209754744,-38.10295740608137 +WT3153RLWDL,3153,5138,Mark Trice,145.2430628711565,-37.829803014239666 +WT3153NIFFF,3153,5138,Aaron Keeton,145.25168369388882,-37.83918200033715 +WT3153IUEOJ,3153,5138,Kenneth Shumaker,145.24728494005137,-37.84696139522771 +WT3153OMRBP,3153,5138,Lawrence Flores,145.26700117934192,-37.82422556609685 +WT3074OTBSU,3074,5130,Belle Oldham,145.03257710917762,-37.689203183058844 +WT3074WLDVX,3074,5130,James Dorris,145.0429477159794,-37.68859624847942 +WT3074JGVWJ,3074,5130,James Boyer,145.03672983553665,-37.6957613835056 +WT3074UPNMK,3074,5130,Kevin Rutherford,144.97495776808915,-37.688909196052016 +WT3104SCUNI,3104,5101,Richard Wilson,145.08704046031517,-37.79068586533052 +WT3104DAHNS,3104,5101,Daniel Hong,145.09809218475283,-37.786702025455035 +WT3104RFPOC,3104,5101,Mary Rodriguez,145.07950352110365,-37.7878012366993 +WT3104ONWBC,3104,5101,Juan Marrero,145.10568967543693,-37.793256776307054 +WT3825QDDSO,3825,10140,Juan Power,146.3474677656966,-37.84853345588591 +WT3825SLOEM,3825,10140,Vincent Booker,146.3977111844961,-37.598364025390914 +WT3181CQDJD,3181,10130,Scott Devlin,144.9973447457726,-37.84556221051096 +WT3181QMTHT,3181,10130,Amanda Hayes,144.99097016623716,-37.85274814551645 +WT3168VWWBG,3168,10098,Lena Nevarez,145.12812102003488,-37.91133584926299 +WT3168SIOCG,3168,10098,John Doyle,145.1486815513588,-37.91239574534277 +WT3135TXDWV,3135,9978,Christina Gray,145.24838863239054,-37.81113511494498 +WT3135MDMMN,3135,9978,Timothy Elder,145.2439049562688,-37.81805597385732 +WT3128RYVPJ,3128,6609,Edward Meeks,145.11265890537797,-37.83439480685845 +WT3128AQDRS,3128,6609,Sarah Kauffman,145.1295813912443,-37.82078823368618 +WT3128BXKMY,3128,6609,Nannie Howard,145.1205335888432,-37.84176430869057 +WT3219ERXHI,3219,4928,Robert Crites,144.40527369300378,-38.20792899559305 +WT3219MZCMM,3219,4928,Charlie Gerber,144.37942394090373,-38.19362930153523 +WT3219WYYSW,3219,4928,Cole Castillo,144.3946040268451,-38.170801213145026 +WT3219MBCXZ,3219,4928,William Carmley,144.40642142260077,-38.19293662482532 +WT3555MGTKL,3555,3281,Thomas Goodermote,144.23839337773072,-36.777089379729375 +WT3555IQZWF,3555,3281,Sandra Owens,144.20885234050343,-36.83529464107439 +WT3555TUBHB,3555,3281,Stella Wooldridge,144.24290208681947,-36.851299479751106 +WT3555TUPHO,3555,3281,Kathy Burleson,144.21497408060986,-36.79436925436562 +WT3555COGPQ,3555,3281,Brian Haynes,144.2066992252292,-36.826364551614084 +WT3555EIYEY,3555,3281,Mark Vaden,144.26284450476723,-36.80793454462067 +WT3193WAACK,3193,3251,Jose Ledesma,145.01476894747725,-37.97198343430003 +WT3193BXUZV,3193,3251,Paul Judson,145.048709489026,-37.969888821153035 +WT3193PUOIW,3193,3251,John Stoltenberg,145.0326368142497,-37.96688756716572 +WT3193GLLFK,3193,3251,Catherine Jones,145.04189978128645,-37.98374958296799 +WT3193MXQJH,3193,3251,Bret Obrien,145.036502806467,-37.97434285400492 +WT3193BFDLZ,3193,3251,Maricela Jones,145.0276458010249,-37.9757161499488 +WT3170FWYAE,3170,9684,Phyllis Prince,145.1720802821059,-37.9224765796093 +WT3170XJVWP,3170,9684,Lucy Lahay,145.17553159514887,-37.936150181976984 +WT3006GWSXT,3006,18808,Anthony Haynes,144.95907536829768,-37.82902551317974 +WT3068YCBLO,3068,18662,Pinkie Perez,144.99596168622807,-37.782887691087915 +WT3031DMFGC,3031,6177,Caroline Luckenbach,144.90707048527796,-37.78767901585732 +WT3031UFTFA,3031,6177,Christina Sanders,144.90480162904436,-37.79999367740217 +WT3031MEYAX,3031,6177,Kyle Johnson,144.90485123451955,-37.77890985650553 +WT3127KDCFK,3127,9222,Robert Garrison,145.11468989151496,-37.81742754036754 +WT3127FDBCA,3127,9222,Anthony Dawson,145.11410063194427,-37.83558955971916 +WT3677BNBDA,3677,6034,Gerald Worstell,146.33635542694262,-36.33507499644104 +WT3677EEGBM,3677,6034,Wesley Bond,146.29670074406582,-36.344999473632335 +WT3677TIDLO,3677,6034,Derrick Payne,146.27382202574398,-36.38615593280632 +WT3048LSNRB,3048,18029,Melissa Woodson,144.94202715958488,-37.661103475045735 +WT3228HJCOK,3228,2562,Paul Mcdonald,144.30259871797708,-38.294963469146026 +WT3228ACWJQ,3228,2562,Tonia Olson,144.31370275023198,-38.336499877690414 +WT3228PSYGN,3228,2562,Raul Jackson,144.19259656608287,-38.3239170790345 +WT3228MNYNJ,3228,2562,Lewis Shephard,144.3218961044523,-38.37079058190962 +WT3228QIIVY,3228,2562,Carl Whitley,144.3580998680485,-38.35158525171141 +WT3228NIQQU,3228,2562,Thomas Sood,144.22485445516622,-38.384604292155636 +WT3228VYIQE,3228,2562,Helen Perez,144.21350061075302,-38.388428144451055 +WT3930SMQKC,3930,4472,Rodney Griffith,145.08367715059237,-38.20218376519485 +WT3930YXHXA,3930,4472,Brittany Chen,145.0705302976687,-38.223967510272765 +WT3930LRSVX,3930,4472,Larry Kampman,145.06202825276205,-38.209569174577844 +WT3930EYEUK,3930,4472,Kim Rowell,145.11232729441548,-38.20586619599625 +WT3043FYBGJ,3043,17716,Kay Mitchell,144.9106703534703,-37.68347447460456 +WT3015PKLER,3015,8736,Bill Kilbane,144.8979183219914,-37.82580808335247 +WT3015IKLNZ,3015,8736,Nancy Martinez,144.90084568923905,-37.82284440696553 +WT3162WLIAO,3162,17448,Carol Smith,145.03794970392784,-37.893085476293294 +WT3129LJJMB,3129,17376,Michael Pilkington,145.10377490433146,-37.799158614303224 +WT3106WCDTM,3106,2374,Maria Guinn,145.12920376131098,-37.76777178042597 +WT3106WQFPR,3106,2374,Mary Bass,145.14274097499288,-37.731835101044354 +WT3106RKPDZ,3106,2374,Alexis Turner,145.1225375091099,-37.76566799999866 +WT3106WEMMG,3106,2374,Mary Brassfield,145.13831336893193,-37.76671007476117 +WT3106RGMJJ,3106,2374,Barbara Hippler,145.1378806908983,-37.74956882168008 +WT3106WWQAH,3106,2374,Melissa Wiggins,145.1447092521517,-37.741227564427945 +WT3106HTUYW,3106,2374,David Bryan,145.14493956217032,-37.74550312585378 +WT3140WMMWJ,3140,5510,Johnny Henderson,145.38704623013305,-37.73201219523685 +WT3140RDCJV,3140,5510,Amanda Stoeckel,145.4033084494358,-37.740104501522254 +WT3140IVMEB,3140,5510,Michele Erben,145.39434206753734,-37.72407305001604 +WT3840LNPIC,3840,5492,Maria Payne,146.34455903747144,-38.2733364542847 +WT3840TZEPL,3840,5492,Charles Finley,146.47175922778905,-38.36891972907457 +WT3840HGKLT,3840,5492,Kathleen Mcnutt,146.406943793533,-38.171958603481386 +WT3198HLLOO,3198,8231,Gretta Webb,145.14560608337254,-38.123088174882035 +WT3198JMWVV,3198,8231,Kyle Flores,145.1430483156538,-38.10348377700504 +WT3220GKZKP,3220,8176,Belen Ward,144.36016585654838,-38.14830817820786 +WT3220ZIKZX,3220,8176,Michael Smith,144.3647743147495,-38.14164316617978 +WT3356PYGHP,3356,16321,Patricia Randolph,143.84517878726803,-37.587543755661756 +WT3187GYVQY,3187,2285,Diana Anderson,145.00670556653714,-37.92915321568199 +WT3187STKWW,3187,2285,Rosalyn Gagne,145.01486064392816,-37.93029567721181 +WT3187VKZRS,3187,2285,Rhonda Houston,145.01239264065856,-37.91589285151207 +WT3187APRIK,3187,2285,Michael Rumph,145.01626056360175,-37.907326097781784 +WT3187VBBYP,3187,2285,Benita Seip,145.01730963025474,-37.93128775701515 +WT3187KANGU,3187,2285,Ivan Bragg,145.00315026723965,-37.92714051573115 +WT3187ISKAN,3187,2285,Rosemarie White,145.01673605674694,-37.913804417644954 +WT3352KHBBN,3352,15996,Richard Askew,143.60419898610786,-37.722432808576656 +WT3079LUHNU,3079,5329,Michael Hackett,145.04616665018042,-37.75945575126896 +WT3079YIXPG,3079,5329,Julia Mendez,145.0244537797928,-37.76320634770149 +WT3079QORWG,3079,5329,Jerry Somogyi,145.05361972090736,-37.76092644646485 +WT3820XLQYV,3820,3988,Ilene Lotthammer,145.89876454720408,-38.21940634596765 +WT3820PEKRB,3820,3988,Jennifer Sutton,145.98391239659566,-38.18069736504627 +WT3820MWDUD,3820,3988,Robert Hsu,145.88373482657425,-38.110247079460194 +WT3820DRLAO,3820,3988,Margarito Deane,145.9118289402152,-38.19483079087872 +WT3564XBKCM,3564,7972,Josephine Gilman,144.94175016410327,-36.12649018753725 +WT3564ZZDZJ,3564,7972,Herschel Boyles,144.83785837021406,-36.052980754665796 +WT3016QHOGE,3016,15560,Eugene Etheridge,144.88212846726813,-37.85329538993079 +WT3103UGROF,3103,7671,Anthony Cruz,145.07195794163297,-37.80237955055203 +WT3103BQYBO,3103,7671,Mamie Brooker,145.08901590487142,-37.807123263756104 +WT3161WKJSH,3161,15269,Blake Crippen,145.0220589964004,-37.86964694733445 +WT3125UPUEW,3125,3003,Lloyd Larsen,145.0985184852589,-37.85456180270574 +WT3125NGSQN,3125,3003,David Sams,145.1085054723482,-37.84198252992474 +WT3125GLAPQ,3125,3003,Robert Bush,145.1078397195417,-37.852238012039805 +WT3125JMVUR,3125,3003,Gerald Haynes,145.09939252257888,-37.853633814713106 +WT3125LLLNT,3125,3003,Joan Henderson,145.1127566726911,-37.86037272460842 +WT3222VJRRD,3222,2493,Rick Peterson,144.53591556523642,-38.15800474772625 +WT3222LIXKY,3222,2493,Roberta Bies,144.62223548689627,-38.2423945705524 +WT3222VBZHL,3222,2493,Lucille Mcdonald,144.56469007377729,-38.23214152585365 +WT3222PZVVW,3222,2493,Sallie Shiver,144.63169168975534,-38.25148580051897 +WT3222CPWEC,3222,2493,Mackenzie Curbelo,144.63106063817153,-38.149022173229504 +WT3222BXTZZ,3222,2493,Morris Rutherford,144.5269237026144,-38.14375836174202 +WT3850WPPZJ,3850,14779,Scott Buggie,146.99670975934802,-38.11120375121315 +WT3147QAQPS,3147,4879,Mark Hinton,145.07541389986514,-37.863627463390735 +WT3147NMGOD,3147,4879,Tracy Bowling,145.0744381846769,-37.8587199206138 +WT3147GJGOI,3147,4879,Cornelius Massengale,145.08808621714442,-37.874757229777096 +WT3400BOZRI,3400,14543,Tom Davis,142.2056868163526,-36.700923449995635 +WT3033ORKFG,3033,14514,Robert Ellsworth,144.8828197808778,-37.742567964334405 +WT3123AWJNB,3123,7160,Marla Siddon,145.05865200046156,-37.83745393770321 +WT3123YZTIF,3123,7160,Paul Earwood,145.05955004240124,-37.82771644759941 +WT3039PBUWA,3039,14250,William Loudermilk,144.92569491883987,-37.765896444531656 +WT3224GRCHF,3224,1773,Maria France,144.44358513125866,-38.21036217909221 +WT3224ZMKSY,3224,1773,Helen Givens,144.41179731951956,-38.15749110854475 +WT3224TNYRI,3224,1773,Michael Israel,144.43655018372564,-38.23965258686051 +WT3224WHHVC,3224,1773,Janis Bagwell,144.45785698279343,-38.186164482416075 +WT3224QJEKV,3224,1773,Bonnie Yearout,144.3989607589969,-38.148372448893284 +WT3224VWVGY,3224,1773,Carl Smith,144.43939681993942,-38.18036746232096 +WT3224OGJJN,3224,1773,Shirley Hall,144.42849521054393,-38.218027859101916 +WT3224DHBWH,3224,1773,Marvin Solis,144.41774574409718,-38.234792588444314 +WT3818GNUCA,3818,14167,Theodore Foreman,145.78951378758498,-38.1167604782299 +WT3226KFMJB,3226,4721,James Sturkie,144.53086672694207,-38.2805983450651 +WT3226NDZWQ,3226,4721,Lloyd Smith,144.5320642015993,-38.27604936623179 +WT3226QUEJX,3226,4721,Mary Stephenson,144.54568575976018,-38.26255690044443 +WT3085IMQNY,3085,13886,Henry Weichel,145.079442159054,-37.735611465967196 +WT3137CDPKF,3137,1541,Keith Stahlman,145.31504320734498,-37.81271433615267 +WT3137XUGBY,3137,1541,Brittany Randle,145.30978516235317,-37.82966565146038 +WT3137SRQVP,3137,1541,Michael Miller,145.3309626109994,-37.83705748721143 +WT3137CZXZW,3137,1541,Edward Vargo,145.33051928414244,-37.82106124500591 +WT3137MGNNQ,3137,1541,Paul Mccorkle,145.30021053704837,-37.80671786701049 +WT3137MJNVX,3137,1541,Sophia Derentis,145.31209224470845,-37.79998391319509 +WT3137PJCVG,3137,1541,Yolanda Stern,145.32887887734955,-37.830025027117365 +WT3137PDNLC,3137,1541,Katherine Cortez,145.31543525088134,-37.81532454600134 +WT3137ZASSV,3137,1541,Catherine Wilson,145.31014451555873,-37.80605239381773 +WT3107BZRNW,3107,4517,Christopher Barnhart,145.1247483858036,-37.76600305637294 +WT3107GYDUG,3107,4517,Stephen Gauger,145.12223287485645,-37.753813171989556 +WT3107VOAOZ,3107,4517,Inez Jennings,145.11629896103574,-37.75239414419074 +WT3556KXCCS,3556,3271,Arron Beauchamp,144.0883649725357,-36.713782960347814 +WT3556NJQUO,3556,3271,Kevin Hackney,144.18023633494656,-36.70627537855721 +WT3556PILGU,3556,3271,Regina Faust,144.11993270090272,-36.71516722997884 +WT3556HIKOY,3556,3271,Diane Wright,144.06787192390885,-36.685858858259905 +WT3355SMNPW,3355,6507,Garrett Wohner,143.7954393324715,-37.498485881815036 +WT3355YJDEY,3355,6507,Isabelle Rice,143.82135772891525,-37.54931090865537 +WT3194BAYCO,3194,12965,Jodi Hadden,145.0624771809979,-37.98414293023302 +WT3142YDQRA,3142,6454,Martha Arterberry,145.00915503895573,-37.8503210054816 +WT3142XWZQO,3142,6454,June Downer,145.02569139013218,-37.842355148933564 +WT3305RFTWU,3305,3204,Harold Ferreira,141.24389275383595,-38.057775476418286 +WT3305TLQLM,3305,3204,Randall Ruffner,141.38702436846057,-38.063546792527006 +WT3305NMFYC,3305,3204,Larry Witter,141.29643421841453,-38.11167114301085 +WT3305KWOFD,3305,3204,Judith Figueroa,141.25644777166127,-38.24079323443777 +WT3018XAVWL,3018,12689,Helen Cannon,144.7757997220566,-37.84941663250125 +WT3041ZBAWR,3041,3103,Eleanor Giles,144.90572295653493,-37.71357670803631 +WT3041EFUEB,3041,3103,Mary Seda,144.90317959622467,-37.73250491358593 +WT3041AJAHR,3041,3103,Marcelina Malone,144.9233764621801,-37.72632689490257 +WT3041GXQOB,3041,3103,Sandra Linsley,144.8943051892376,-37.737252273500395 +WT3250BJUFW,3250,6125,Howard Casey,143.5658226194567,-38.340870067720694 +WT3250ORKZX,3250,6125,Dayle Ward,143.56058751062506,-38.32020730830798 +WT3941IMDBZ,3941,12172,Christopher Ryan,144.78630521204593,-38.353220128503 +WT3025OMYBR,3025,2430,Georgene Mcvay,144.87256703440102,-37.834135335229035 +WT3025JXFHB,3025,2430,Bonnie Downin,144.81149412873438,-37.8307798053919 +WT3025SSHJN,3025,2430,Tyler Moons,144.8607062768072,-37.83481483800496 +WT3025FPAHS,3025,2430,Joyce Munn,144.79563297522262,-37.82634923994355 +WT3025UXSIE,3025,2430,Willie Laigo,144.79429337101448,-37.82881778367748 +WT3089VZMEY,3089,5866,Gary Harper,145.1487810665617,-37.67651676508226 +WT3089JYMHF,3089,5866,Dorothy Reid,145.15856967777128,-37.684864473616706 +WT3078AEKPE,3078,11638,Dexter Good,145.00140644595922,-37.76493422121156 +WT3034FCAXP,3034,2908,Winifred Sears,144.86879041622356,-37.75579478738804 +WT3034DODDT,3034,2908,Olivia Mctigue,144.86123163230448,-37.77142997149443 +WT3034ZYMIL,3034,2908,Donald Salvo,144.84766226766504,-37.7513737230498 +WT3034BFDJN,3034,2908,Janice Johnson,144.86548847067067,-37.774191057535255 +WT3631TQNZV,3631,2322,Jason Burkett,145.4363498286167,-36.31970925700745 +WT3631NDVKY,3631,2322,Ernest Jarrell,145.52535564282212,-36.335961472056894 +WT3631VJGLO,3631,2322,Nora Kelly,145.4546604189178,-36.45306461119483 +WT3631QGZOC,3631,2322,Teresa Pickett,145.4473711799922,-36.37508002234908 +WT3631ZSUMB,3631,2322,Thelma Carlton,145.533912908864,-36.3800742996389 +WT3197VSZGX,3197,5774,Mary Edwards,145.15664578721774,-38.08070005147733 +WT3197HMHVF,3197,5774,Ann Somerville,145.12310528133722,-38.086811727473744 +WT3057EKGHR,3057,11504,Rosemary Tiger,144.9799749433599,-37.77342887683817 +WT3177XFTPO,3177,3768,Bonnie Studivant,145.2322298542572,-38.0053537370745 +WT3177SLLBH,3177,3768,Rosetta Miller,145.23162850607062,-37.98363939529452 +WT3177TWMBO,3177,3768,Grace Huff,145.22954841602555,-37.992617480012846 +WT3585AFUMM,3585,11206,Ray Howe,143.37572389146328,-35.31277481441913 +WT3936ONNXE,3936,11024,Lisabeth Griego,144.98877850527248,-38.34453491575655 +WT3205CQCBS,3205,5460,Carol Troy,144.96625085578012,-37.83921661275396 +WT3205YOMLV,3205,5460,Ruby Austin,144.96598185610463,-37.83222345331254 +WT3105HWZUC,3105,10873,Thomas Stevens,145.0793227627599,-37.759546369688216 +WT3803NHPOC,3803,5427,Larry Combes,145.28746561363045,-38.02446244976362 +WT3803ECHEF,3803,5427,Willie Robertson,145.25915636961093,-38.02390681128392 +WT3777BKKPU,3777,3583,Byron Robinson,145.56251489376504,-37.514394044516564 +WT3777XHWTI,3777,3583,Helen Sullivan,145.5831890489861,-37.61249810449512 +WT3777TUHYI,3777,3583,Michael Livingston,145.52058795514893,-37.65224612703273 +WT3978EELMS,3978,10648,Andrew Tylor,145.31853095518233,-38.091686569586926 +WT3190LSXPY,3190,10454,Carl Velazquez,145.05876365045188,-37.948438331194595 +WT3437HTTIH,3437,3479,Benjamin Warner,144.63779108476163,-37.469629767097395 +WT3437TZCMM,3437,3479,Donald Sandoval,144.51080560660586,-37.50036783211931 +WT3437KHBPL,3437,3479,Charlotte Green,144.59696365066134,-37.48113208398435 +WT3008PNJNN,3008,5218,Ralph Barkley,144.9518521922696,-37.81145194486184 +WT3008JHENP,3008,5218,Cynthia Shields,144.92668824617908,-37.823212653316155 +WT3672CRWAS,3672,5165,Mark Mohler,145.95064248540996,-36.584029923356006 +WT3672RXSCH,3672,5165,Ronald Harbin,146.00884073469686,-36.563773100689275 +WT3151QBMSM,3151,3424,Malcolm Little,145.15885697551238,-37.85776252887035 +WT3151ANFQX,3151,3424,Daniel Davis,145.16632131582105,-37.84908719684687 +WT3151JBTSG,3151,3424,Ashley Manning,145.1326095487824,-37.85076505375052 +WT3191GBTSQ,3191,10241,Laura Ryan,144.9960217828986,-37.944975559503995 +WT3995ZBHTV,3995,10173,Leigh Craven,145.61781035048253,-38.556131563368474 +WT3300SXKBR,3300,5044,Martha Jones,141.943401661104,-37.66005370567887 +WT3300BEMMJ,3300,5044,Ricky Stonebraker,141.94272923667302,-37.768451341073664 +WT3915YKMGK,3915,9960,Melissa Butler,145.1013485299018,-38.32429035535604 +WT3116JXQMD,3116,4936,Susan Tucker,145.3372717131245,-37.71671338410589 +WT3116SVYNP,3116,4936,Rickey Labarbera,145.29685887066887,-37.74611473508058 +WT3691QKGPV,3691,9704,George Quinones,146.63888213422413,-36.309341832307794 +WT3377FUDEI,3377,9416,Linda Olsen,142.9596593170925,-37.27763193783621 +WT3004PTTBC,3004,3102,Velma Stewart,144.97791590174103,-37.82012529523898 +WT3004EMANT,3004,3102,Steven Shepperd,144.98788265746035,-37.81686712169189 +WT3004PMCVW,3004,3102,Christopher Brown,144.98359216736148,-37.84437498132179 +WT3049MXNED,3049,3087,Loretta Hinderman,144.89821647835635,-37.66293779630895 +WT3049IAJCL,3049,3087,Brian Davis,144.91179868117703,-37.67996627573396 +WT3049FVZGN,3049,3087,John Smith,144.91072359690028,-37.662653490772016 +WT3644SBXGF,3644,4613,Robert Reyes,145.7529888801693,-36.03665059744477 +WT3644NLXJO,3644,4613,Curtis Hoke,145.5435986973334,-35.876136960997215 +WT3019ASCJP,3019,3065,Charlotte Coutermarsh,144.85492421197495,-37.772589492919515 +WT3019JIKGX,3019,3065,Vincent January,144.85730316799982,-37.7718018219131 +WT3019RXXZW,3019,3065,Amy Taylor,144.8599464042601,-37.774918978474545 +WT3764ZHPVF,3764,4582,Tara Ward,144.9533178550078,-37.10942527971903 +WT3764MKCUE,3764,4582,Alejandrina Salazar,144.970506104261,-37.15854276662507 +WT3629PMEPU,3629,9127,Reid Feldmann,145.21981730157358,-36.35945078374604 +WT3143DCPOC,3143,3018,Mary Bowers,145.02938317853184,-37.86258914550739 +WT3143IYVIZ,3143,3018,James Kemp,145.02759917907088,-37.857112959399466 +WT3143NQMZP,3143,3018,Francisco Gutierrez,145.01040076549717,-37.861596046002276 +WT3087WBGNY,3087,9031,Carl Estabrook,145.07655868788908,-37.70421795747069 +WT3757QOZTE,3757,2986,Kathleen Reiner,145.342552305163,-37.51695722666812 +WT3757ZYUMU,3757,2986,Meghan Pignone,145.18645133524964,-37.422662010662926 +WT3757PRIEV,3757,2986,Larry Pierce,145.1118904508526,-37.46718538934005 +WT3730UTUPX,3730,2944,Curtis Johnson,145.8390200963087,-36.01276678240247 +WT3730XYUBK,3730,2944,Diane Ulberg,145.7667686668467,-36.01802053425753 +WT3730EFJWK,3730,2944,John Nelson,146.19031829509552,-36.09578729271634 +WT3148QGULY,3148,4320,Priscilla Little,145.10910727319913,-37.88503978009914 +WT3148LWECX,3148,4320,Belinda Jefferson,145.1011737287189,-37.880916247729026 +WT3066ORIHJ,3066,2128,Doris Hazard,144.98926829046363,-37.80512744956145 +WT3066PVXAM,3066,2128,Josh Cecil,144.9862688428555,-37.79776592949474 +WT3066TZXKY,3066,2128,Greg Rodriguez,144.98624403796103,-37.80627173136043 +WT3066TGSMU,3066,2128,Lillian Hesser,144.98728939865242,-37.798371404841745 +WT3113YCFFU,3113,4228,Lula Carter,145.22572505521666,-37.73935349050789 +WT3113NDCEY,3113,4228,Antonio Hill,145.18073448457255,-37.73230213369918 +WT3054SQEQA,3054,8428,Eugene Salano,144.95861592679725,-37.783412869711185 +WT3620DPAMB,3620,4120,Ben Oneil,144.96824098896346,-36.398921729744224 +WT3620XKMXQ,3620,4120,Julie Zazula,145.18651160619237,-36.185252751663754 +WT3067PFFLY,3067,1366,Willie Raggs,144.99277550851377,-37.81165277804152 +WT3067QULCR,3067,1366,Thomas Gordon,145.00799772925978,-37.80647549142817 +WT3067RDWCI,3067,1366,Lynette Erwin,144.99182058019107,-37.80684026619632 +WT3067MKBAR,3067,1366,Jeffry Huber,144.9965119159561,-37.806957906476974 +WT3067WJXTJ,3067,1366,Judith Eckenrode,144.9891625434605,-37.80163864602102 +WT3067BLHHJ,3067,1366,Margery Smith,144.9948893230766,-37.80237623916429 +WT3351UVIHV,3351,8168,Donald Wilkinson,143.27416699148256,-37.614929659179204 +WT3804RXIMQ,3804,2023,Terrance Bromley,145.310885608323,-38.001442816771736 +WT3804OQOOF,3804,2023,Jackie Smith,145.35298253700518,-37.98426462189473 +WT3804JDRQA,3804,2023,Robert Porter,145.28323835023517,-37.95378621144045 +WT3804MBVLD,3804,2023,Polly Hoople,145.33015033642127,-37.98767496906432 +WT3126UEECR,3126,8056,Dianne Nance,145.08096937230013,-37.8210242477313 +WT3909HFRJQ,3909,2633,Maria Rhodus,147.90601975805444,-37.764598529015366 +WT3909AXOWH,3909,2633,Kristie Bode,148.0555693607876,-37.78991129086548 +WT3909VJNLQ,3909,2633,Soledad Hurtado,148.10035183210377,-37.724162743489586 +WT3953WADSR,3953,1571,Clinton Bailey,145.78786815135106,-38.43916558433166 +WT3953SGAEI,3953,1571,Ofelia Kadlec,145.77800174296402,-38.55984015166651 +WT3953GRHIM,3953,1571,Stuart Doyle,146.07894653869226,-38.46139149239377 +WT3953GRXRE,3953,1571,Sylvia Brown,146.17199619819715,-38.38154682840454 +WT3953NPQQN,3953,1571,Peter Willer,146.04193592469497,-38.44633595871089 +WT3782AQUFZ,3782,7827,Bonita Mangan,145.4551855517829,-37.92661137122033 +WT3922MDPCX,3922,1289,Bruce Kruse,145.25316073669387,-38.51899609588197 +WT3922JVYVK,3922,1289,Tara Law,145.17599762291508,-38.487246277390646 +WT3922JDUTN,3922,1289,Judy Ross,145.28537516549176,-38.51407044024659 +WT3922WWJZY,3922,1289,Elijah Hunt,145.2447827591404,-38.4848574951737 +WT3922GKMBB,3922,1289,Brady Oglesby,145.18995016670905,-38.48860277298002 +WT3922PHWRX,3922,1289,Louise Mcdonald,145.2376742866865,-38.46448487862177 +WT3660XHDRV,3660,1262,Erik Guel,145.5051483633239,-36.91390306327884 +WT3660CESRK,3660,1262,Kim Graham,145.3228931083454,-37.10179760482139 +WT3660BHLDZ,3660,1262,Brian Brasil,145.50018943200558,-37.10893561456951 +WT3660UOMTS,3660,1262,Susan Storm,145.467449588922,-37.07762299407432 +WT3660QSTIB,3660,1262,Dennis Nguyen,145.28496089529546,-36.996553633203206 +WT3660ZHPVI,3660,1262,Jeff Fetherston,145.07968244652514,-37.052214044405076 +WT3180WOFIE,3180,2487,Catharine Diaz,145.26273417587512,-37.90066045017715 +WT3180KJTWT,3180,2487,Julie Hash,145.25618519655262,-37.87398522411325 +WT3180DKICU,3180,2487,Phyllis Terry,145.23918782404462,-37.884144489556725 +WT3223OOZBW,3223,2465,Sheila Gray,144.63524592163125,-38.20656233788676 +WT3223RWIHD,3223,2465,Theodore Christopher,144.61706094924273,-38.1020143467612 +WT3223JFBYI,3223,2465,Guy Larocca,144.61099219539284,-38.16247156775349 +WT3809YTBHH,3809,1802,Florence Williams,145.43460663547293,-38.02183804740044 +WT3809PDGEK,3809,1802,Nicole Dye,145.4070791349842,-38.065057490534805 +WT3809ZYQDB,3809,1802,Peggy Anderson,145.45372252218934,-38.045085403051246 +WT3809JZQMX,3809,1802,Joseph Mayers,145.45613861143133,-38.121534959744224 +WT3860OPGLP,3860,2390,Jason Evans,147.09728938038828,-37.96253281803679 +WT3860BZTXE,3860,2390,Lucille Johnston,147.1448485506306,-37.711905494546116 +WT3860UCTWZ,3860,2390,Calvin Klein,147.17829920967256,-37.86321009958664 +WT3807TGUBX,3807,2365,Dorris Pennington,145.37070956738168,-38.05107840171075 +WT3807UFNAP,3807,2365,Francis Montgomery,145.40416010092343,-38.021356613911976 +WT3807PZHPR,3807,2365,David Pizarro,145.3626328162128,-38.05489065080597 +WT3450XHQGS,3450,1708,Willis Jasso,144.22386015866184,-37.061341934677074 +WT3450JQQRD,3450,1708,Robert Wood,144.24981065143234,-37.06989150317421 +WT3450FASHP,3450,1708,Tonya Cross,144.20704326499535,-37.06521131515332 +WT3450LBNRD,3450,1708,Caitlyn Warden,144.24347782702498,-37.04838315318216 +WT3765SHSPB,3765,3380,Eilene Horner,145.36201379669092,-37.81894302945288 +WT3765XZDSF,3765,3380,Susan Compton,145.32698014492004,-37.82618684116462 +WT3158AUSOJ,3158,3326,Vanessa Adams,145.34291881249214,-37.90412906071253 +WT3158FLOBC,3158,3326,Elbert Sutton,145.33108911112143,-37.920765975046 +WT3027KUPSY,3027,3323,Sonya Renick,144.7621343752908,-37.861911455007174 +WT3027FZKQC,3027,3323,Angelo Hard,144.73167189283603,-37.85646049026309 +WT3217MDZVX,3217,6607,Andrew Ward,144.40663713124954,-38.2996197431434 +WT3380GWOCZ,3380,6032,Clyde Gallo,142.84006482043034,-36.992418579611 +WT3179QTYXJ,3179,3011,Darnell Phelps,145.2050895825477,-37.91374760225387 +WT3179QKUWC,3179,3011,Wendy Baker,145.19746265109166,-37.90965455901277 +WT3036XTIIL,3036,1481,Katherine Miller,144.77405705329488,-37.68738739758373 +WT3036CKDXS,3036,1481,Harold Harmon,144.81961864598148,-37.66870859055842 +WT3036IQITW,3036,1481,Douglas Downs,144.78389069686594,-37.66161092059724 +WT3036OUJLY,3036,1481,Jenny White,144.8312170300855,-37.67194392009214 +WT3189MHBOB,3189,1179,Wayne Bello,145.05523156176483,-37.94118140841387 +WT3189LGHIA,3189,1179,Annie Longmore,145.06543156075276,-37.939107386085695 +WT3189ZUMEU,3189,1179,Susan Flores,145.04315019561668,-37.937324860748454 +WT3189EWADM,3189,1179,Christopher Anderson,145.03717703278747,-37.94372275534058 +WT3189VOGYS,3189,1179,Jill Smith,145.03754557173104,-37.942023554760674 +WT3799ZWGYC,3799,1932,Lana Jones,145.88439101081204,-37.69655285293283 +WT3799IBQMR,3799,1932,Camilla Swenson,145.88316517396308,-37.742377391043284 +WT3799JWZTS,3799,1932,Willie Barone,145.6961436573016,-37.650946513835954 +WT3851KHODW,3851,2843,Tara Garza,147.29430937004628,-38.222542302101765 +WT3851YKVHY,3851,2843,Jeffrey Clark,147.4335844947092,-37.987941395300496 +WT3996ZMYGL,3996,1846,Jennifer Adkins,145.7771574897382,-38.67107249698782 +WT3996YCWHN,3996,1846,Kendall Pruitt,145.71188329405038,-38.66201360381448 +WT3996APJTL,3996,1846,Ronald Cook,145.77210936101585,-38.66087320895411 +WT3003QBFSM,3003,1838,Michael Blevins,144.91998133092056,-37.81279720127272 +WT3003VUBNO,3003,1838,Doris Smith,144.91338943948188,-37.81827164893964 +WT3003BXJAK,3003,1838,Vera Mitchell,144.92878408202418,-37.798436262713885 +WT3579FLKUI,3579,1788,Daniel Ruark,144.01732514096102,-35.954113241603984 +WT3579HGUQO,3579,1788,Laura Smith,143.56878720073288,-35.87996758720554 +WT3579ZMHJW,3579,1788,Yolanda Early,143.90579325337166,-35.83008267688475 +WT3616MGKKD,3616,2678,Flossie Stclair,145.0382395354934,-36.48540758333834 +WT3616OIHDJ,3616,2678,Virginia Parris,145.0987959215873,-36.5227154806513 +WT3636ETBDB,3636,873,James Reardon,145.42411679647267,-36.13415691671104 +WT3636LTWLQ,3636,873,Amy Gurry,145.5876432641729,-36.08288311428853 +WT3636LGQMA,3636,873,Arthur Stgermain,145.44985593950616,-36.056801348170765 +WT3636ZRPAC,3636,873,Donald Renz,145.57637663494174,-36.067347824534416 +WT3636ZFUGM,3636,873,Susan Welchel,145.4256515582462,-36.05797348648649 +WT3636HKVUH,3636,873,Stanley Jones,145.40354855082188,-36.135166241815746 +WT3984XMPJU,3984,1041,Bernard Robinson,145.66611292275098,-38.41371341264712 +WT3984UBSFJ,3984,1041,Ned Johnson,145.61381415852048,-38.3660140349184 +WT3984SHWQW,3984,1041,William Owen,145.59521341508736,-38.282975922513835 +WT3984QFXFT,3984,1041,James Prewett,145.48971810892024,-38.317370725661895 +WT3984IZIBD,3984,1041,Cesar Medina,145.65147470367967,-38.25469355497106 +WT3434AMRMK,3434,5069,Sonia Polanco,144.7102829177065,-37.414787654577225 +WT3061TZMKP,3061,1685,Phillip Lynch,144.96238876406008,-37.65056788272415 +WT3061LOUYX,3061,1685,Ronald Thompson,144.97374071978143,-37.64821258420374 +WT3061BZKPA,3061,1685,Cecelia Lewin,144.97230861471036,-37.64316122799456 +WT3722XULRS,3722,5018,Helene Huber,146.19396910715247,-37.08656660910376 +WT3002YFCMY,3002,4964,Dora Grooms,144.97412033255623,-37.811182979448056 +WT3940WZCWZ,3940,2465,Gloria Roberts,144.86715846693173,-38.37676586477035 +WT3940UVMRS,3940,2465,Harold Kassab,144.88951915153942,-38.375089887240684 +WT3981DOYYE,3981,1632,Ruth Roberts,145.40357770711884,-38.22648087703851 +WT3981LHGQV,3981,1632,Michael Hayes,145.7241613476498,-38.26428001607835 +WT3981HFCDJ,3981,1632,Nellie Cassella,145.42159162016495,-38.25805321222125 +WT3227LRSVA,3227,4819,Joan Cox,144.38837299987338,-38.22664848840161 +WT3950WWFHI,3950,2400,Donald Neil,145.789697571232,-38.44829776894874 +WT3950QHSQT,3950,2400,James Guerrero,145.8537009069294,-38.42146300495086 +WT3842LLUAZ,3842,2391,Justin Butcher,146.43738290720543,-38.33409319136186 +WT3842UWRZX,3842,2391,Daniel Cole,146.4260527153197,-38.31033873786668 +WT3747DHCFR,3747,2312,Delia Haynes,146.8417942671603,-36.36420895477979 +WT3747XBOXY,3747,2312,Homer Moore,146.75846945554298,-36.41270523624899 +WT3781EASUZ,3781,1492,Carmelo Nicholas,145.47483429717292,-37.93712078940373 +WT3781QLYFA,3781,1492,Sharon Trask,145.5257307263254,-37.87860456041545 +WT3781NYYHV,3781,1492,Lynda Nastasi,145.489813558002,-37.99277716147479 +WT3401EAPLO,3401,2210,Eric Ellis,142.10320851191588,-36.72822117152589 +WT3401WPITF,3401,2210,Kevin Woods,142.45385599031363,-37.254109629673565 +WT3461QSXXB,3461,4149,Stephanie Troupe,144.19879954226982,-37.16497108770965 +WT3225ZLHVP,3225,1352,Theola Pugh,144.6151145784595,-38.24951546874845 +WT3225ZWRKT,3225,1352,Sierra Zelaya,144.63248453729392,-38.273920927385454 +WT3225RKBIH,3225,1352,Eric Clark,144.60253933576172,-38.23799434037219 +WT3213XUYAP,3213,4033,Jordan Billings,144.20150739455903,-38.09131990974338 +WT3880XJEVE,3880,2016,Brady Condon,147.8819082206602,-38.0163438406868 +WT3880BUCZX,3880,2016,Michael Andersen,147.82927661233808,-37.86188798085973 +WT3971GFDIU,3971,669,Shirley Solis,146.8002601948809,-38.7598825163408 +WT3971UHZGX,3971,669,Lien Yoon,146.72931020113865,-38.46557168867185 +WT3971MGARE,3971,669,Joseph Nutter,146.42859858283558,-38.67926740909462 +WT3971MLSXH,3971,669,Beverly Hardt,146.86063586361163,-38.55173732935933 +WT3971XBBMK,3971,669,Grace Gordon,146.87348584083944,-38.725544946677644 +WT3971GNWLP,3971,669,Patti Kennedy,146.47649393813555,-38.61329665766569 +WT3431IFUSY,3431,3947,Nellie Adams,144.6804185372361,-37.442212511059296 +WT3093HJWIG,3093,972,Benjamin Meadows,145.10671344464265,-37.74423120940089 +WT3093UMONC,3093,972,Chris Mckinney,145.12667114522216,-37.72572554970407 +WT3093NLHIM,3093,972,Joshua Coons,145.11820148991805,-37.74433369520455 +WT3093ROONW,3093,972,Sharon Wells,145.11554389950476,-37.747315564024305 +WT3775QKPWA,3775,772,John Covington,145.31376604275735,-37.628386398987416 +WT3775DRWUQ,3775,772,Kathleen Besson,145.4407141306498,-37.5625062579209 +WT3775TOGZK,3775,772,Amy Casey,145.4385089903036,-37.64127240412888 +WT3775PGCXX,3775,772,Margaret Mix,145.36522115782017,-37.59791868890256 +WT3775HGGFI,3775,772,Joseph Roshia,145.2776078617146,-37.59705480543411 +WT3918DSFOP,3918,926,Lindsey Jackson,145.1805234976719,-38.33830054668654 +WT3918IJIJQ,3918,926,Sean Conroy,145.1981144167953,-38.316951703963106 +WT3918FYJQN,3918,926,Flossie Hudson,145.14086679590315,-38.350153661359435 +WT3918CDEEZ,3918,926,Connie Beveridge,145.16250445821373,-38.34608816687449 +WT3523CQSWP,3523,905,Mark Seller,144.72894916684078,-37.00934236074207 +WT3523JHSKW,3523,905,Jerry Barth,144.56391677604657,-36.97463976031401 +WT3523XJZBV,3523,905,Charles Donnell,144.7473429583665,-36.770146356766034 +WT3523VFRMV,3523,905,Gina Pickle,144.8838222135247,-36.7036137884041 +WT3549JBGSR,3549,1174,Christopher Shiever,142.6845872365345,-34.77636039256747 +WT3549KQPCN,3549,1174,John Mitchell,142.94017265436088,-34.72498458121197 +WT3549RPPGD,3549,1174,Brandon Handley,142.5652089698158,-34.67445434684168 +WT3363LPXKX,3363,1739,Arthur Washington,143.80051932471937,-37.43976981496703 +WT3363UVPZV,3363,1739,Ahmad Edmondson,143.96168044083402,-37.36188835464135 +WT3797FCQZL,3797,1738,Dawn Link,145.59712782997835,-37.885650618120096 +WT3797JXEYZ,3797,1738,Wade Seay,145.59525777895735,-37.85187937890587 +WT3925TJOQL,3925,1128,Stephanie Mueller,145.3722231137187,-38.53323415588145 +WT3925HPDPE,3925,1128,Patrick Mckinley,145.40598118455455,-38.51067698346221 +WT3925LANPO,3925,1128,Alex Mcdonald,145.3952406888683,-38.50885963827309 +WT3980JJOQY,3980,1675,Heather Strahl,145.42551264755082,-38.208375772057366 +WT3980CXZJX,3980,1675,Marianne Gulledge,145.38407991603268,-38.234540388656654 +WT3913EJDEA,3913,3338,Norma Hammond,145.1598674095822,-38.281966498905305 +WT3919IOIFE,3919,3183,Candice Redman,145.20106213477456,-38.34719888248039 +WT3862WPONG,3862,1578,Anthony Dawkins,147.33271058732282,-37.491238739170896 +WT3862XHAPV,3862,1578,Michael Stover,147.32373694126133,-37.84325812411646 +WT3741DMMXM,3741,3100,Gwendolyn Donaldson,146.97457672634275,-36.739842150839856 +WT3266OQUZV,3266,3067,Jack Wilcoxen,143.24967426940597,-38.463018360522085 +WT3808KZZPA,3808,1516,Asuncion Mays,145.46459157313026,-38.00294661504681 +WT3808MMGCV,3808,1516,Alice Schmelz,145.47627366088184,-37.96999032738656 +WT3858VBJEZ,3858,1008,Frank Mckay,146.4643872269934,-37.70128412623101 +WT3858TSNDX,3858,1008,Angela Dexter,146.81008375978269,-37.217445513139786 +WT3858IFQCA,3858,1008,Pauline Botkin,146.59834034532963,-37.4913716247717 +WT3723LMJSJ,3723,1502,Oscar Sears,146.27332024772176,-36.948121056075905 +WT3723ARNTR,3723,1502,David Dunaway,146.07736519208603,-37.2571342766942 +WT3821UBUGE,3821,1458,Clarence Harty,146.01659205377223,-38.22109648407308 +WT3821GKQVH,3821,1458,Tina Rogian,146.04675100939392,-38.19914720889278 +WT3202IDOPR,3202,1453,Shannon Bello,145.07561474247163,-37.947828524869706 +WT3202VGFWI,3202,1453,Edward Mohorovich,145.0981452676193,-37.94451896393119 +WT3871VBOCO,3871,1451,David Hudnell,146.05740583635816,-38.491370012341534 +WT3871XVSOD,3871,1451,Mark Martinez,146.26247857549268,-38.26173487936323 +WT3435VCHKG,3435,1439,Vernon Revak,144.7089588943855,-37.31146009548804 +WT3435JZWPT,3435,1439,Felix Barth,144.69925406147158,-37.247863420517085 +WT3938HFIAY,3938,2823,Robert Cashio,144.93339758681753,-38.36495278578952 +WT3956NITYU,3956,940,Liz Quinonez,146.1714906085415,-38.80866659787346 +WT3956DVIYM,3956,940,Carol Twichell,145.78969686154355,-38.615205287883846 +WT3956VQBJJ,3956,940,Jesus Fabbri,146.00509974244184,-38.86981870990471 +WT3418MGKYO,3418,2772,Joyce Smith,141.97956043404395,-36.27578953921955 +WT3304LTOER,3304,681,James Broadway,141.91304296053238,-38.08286392590754 +WT3304USCDE,3304,681,Pat Smith,140.93954785911416,-38.22891906650568 +WT3304KHKYN,3304,681,Robert Magnuson,141.9041115605597,-37.909520270955575 +WT3304ZOOWD,3304,681,Johnny Huszar,141.39029459667637,-38.230244337190726 +WT3685BGXYX,3685,1361,Michael Weatherspoon,146.56300339579627,-36.06275691306193 +WT3685KJYXY,3685,1361,Shirley Prescott,146.3159746578374,-35.97378625619464 +WT3816RKVGQ,3816,2721,Winston Steinberg,145.76227139481438,-38.05153945228166 +WT3393KRBTF,3393,2685,Brenda Neil,142.2439016007552,-36.06948475728159 +WT3717WFWMH,3717,378,Craig Carlson,145.22341733206022,-37.50301192704405 +WT3717DKRXQ,3717,378,Herbert Rumph,145.6371099034687,-37.39509154708391 +WT3717MXQAF,3717,378,Eddie Campbell,145.272309284533,-37.47847706412625 +WT3717YSAOA,3717,378,Woodrow Spangler,145.361057179615,-37.414640086471316 +WT3717DWKIB,3717,378,Mike Williams,145.29333280140304,-37.13869236134871 +WT3717QUVQX,3717,378,Raymond Rodriguez,145.62713373691372,-37.196187004616725 +WT3717IPOUJ,3717,378,Carole Diliberto,145.29745211016086,-37.32235452582552 +WT3265TGYJP,3265,655,Fernando Spence,142.60851730446618,-38.077342728842595 +WT3265FDRMI,3265,655,Anthony Colon,142.88505696453913,-38.059164845297275 +WT3265AKLOT,3265,655,Nanette Murray,142.77077580742395,-38.149275103330446 +WT3265GYEAQ,3265,655,Chandra Le,142.60073204650038,-38.28789824374261 +WT3460LWSIY,3460,427,Caitlin Thompson,144.1376624005498,-37.30864007574308 +WT3460HCAZF,3460,427,Raul Taylor,144.08941044452567,-37.32284358995993 +WT3460HSJMZ,3460,427,Susan Smith,144.19283622829303,-37.37123650833884 +WT3460QYPZU,3460,427,Sonia Smith,144.0929025570156,-37.33553746695268 +WT3460SQGST,3460,427,Lawrence Troyer,144.1335916035009,-37.29758208356775 +WT3460YLOEY,3460,427,Annette Wyckoff,144.14883087817967,-37.37592921512407 +WT3960XUPWM,3960,2474,Herbert Harding,146.421896745783,-38.56082923796351 +WT3478NOSNX,3478,614,Mary Wooster,143.190083774406,-36.70864776402552 +WT3478BKYFZ,3478,614,Cristi Wetzel,143.13487923201885,-36.63308167121733 +WT3478DPGUK,3478,614,Soledad Seward,143.26754985570844,-36.88219170892449 +WT3478CBJTX,3478,614,Walter Robichaux,143.30067747372127,-36.79402421918099 +WT3463YMKAQ,3463,1225,Rose Lemelin,144.03588920833235,-37.01825568547842 +WT3463WLBBM,3463,1225,Catherine Schoonover,144.1844949063334,-36.98546058925213 +WT3608QIPDQ,3608,2418,Sarah Carabajal,145.2922659688898,-36.87430114139095 +WT3438CQCDY,3438,2387,David Stallings,144.586903151697,-37.446514751709444 +WT3621BVNYS,3621,2368,Wendy Louder,144.93731254161733,-36.131357555394445 +WT3090YMXMC,3090,1182,Laurie Hoppe,145.10432370123303,-37.656224265693986 +WT3090WEYIC,3090,1182,Jeanette Longmore,145.1123887007391,-37.68035572698927 +WT3812PLMLE,3812,770,Richard Suggs,145.57000321394543,-38.15138732269093 +WT3812XETYP,3812,770,Evelyn Wiseman,145.52655043632882,-37.989869951921904 +WT3812JQWAR,3812,770,Evelyn Owens,145.5275783506644,-38.12569037324767 +WT3373DXBDC,3373,573,Michelle Blind,143.4011825913708,-37.53673475574405 +WT3373HEMID,3373,573,William Gordo,143.13551462862847,-37.443289292032226 +WT3373ZJBZG,3373,573,Helen Hu,143.40004730403342,-37.327257624451846 +WT3373FDEUM,3373,573,Phyllis Hegyi,143.19424925274458,-37.38771716562931 +WT3814AGEVJ,3814,751,Kelly Turner,145.675337380621,-38.140210095424855 +WT3814OVCAP,3814,751,Donna Kester,145.66728248121504,-38.07119647817931 +WT3814SZYBR,3814,751,Byron Needham,145.6460050878868,-38.146876218389096 +WT3847RJDXL,3847,2191,Pat Burgess,146.86381739995323,-38.14386715522482 +WT3758GCVZS,3758,1090,Patricia Tiller,145.05303811607297,-37.37848946997211 +WT3758DJMSW,3758,1090,Christopher Allen,145.07570994771004,-37.371226033041694 +WT3638KIKMI,3638,691,Helen Keeley,145.2960240784953,-36.004820704107786 +WT3638XYYRG,3638,691,Craig Borman,145.18508840410325,-35.91762676338385 +WT3638OJFZH,3638,691,Marco Roberts,145.2057899755399,-35.96325643047504 +WT3440LHTRC,3440,2040,Candace Sutch,144.51033301855105,-37.40338784269493 +WT3096GCQVQ,3096,980,Michael Canclini,145.1909666670253,-37.64870481664699 +WT3096KTMPT,3096,980,Roberto Moncrief,145.18905739417752,-37.67924845022556 +WT3458TDFZR,3458,972,Cynthia Yu,144.37057972703673,-37.5430928247561 +WT3458FSKZU,3458,972,Eugene Henry,144.40088295549785,-37.45682082060834 +WT3515HIKOU,3515,1944,Evelyn Alcala,144.13527329174417,-36.86696311522371 +WT3501INFDS,3501,970,Dan Newton,142.12459109318573,-34.98177118462669 +WT3501XTYVM,3501,970,Brandy Lard,142.5152177429413,-34.87782592786268 +WT3749WLSOZ,3749,944,Betty Garguilo,146.8086945461124,-36.39710610515253 +WT3749WOROF,3749,944,Joseph Frost,146.84917800445172,-36.337092913340356 +WT3885EGHSP,3885,935,Karen Croley,148.48619319329754,-37.187550934582305 +WT3885TPBJO,3885,935,Lois Jones,148.2592600503724,-37.30244454304162 +WT3480QEOMO,3480,618,Ethel Priem,142.79101191322778,-36.49144056495796 +WT3480HSGMP,3480,618,Pamela Sagraves,142.71248613141526,-36.36060974795042 +WT3480GVRDF,3480,618,George Duncan,142.99418175789054,-36.20726079107059 +WT3823TUJXY,3823,919,Dianne Moore,146.11274477795862,-38.205813313194334 +WT3823IJDAQ,3823,919,Harvey Luce,145.996146854936,-38.3093020930862 +WT3707PYCEU,3707,918,William Payne,148.0126149180994,-36.827066656604 +WT3707TDXBB,3707,918,Stephen Kelley,147.92956417771916,-36.525039945910116 +WT3675CGSWG,3675,902,Sandra Holland,146.08960006289036,-36.49929801269455 +WT3675UTKNU,3675,902,Joseph Perkins,146.18864295305394,-36.27398783597474 +WT3370QYSHJ,3370,356,Paul Padilla,143.83477274787955,-37.283037043706784 +WT3370KWSUP,3370,356,Anna Thornton,143.8418718265147,-37.31545114597499 +WT3370XRAHI,3370,356,Tammy Compton,143.76050524940354,-37.17889378247109 +WT3370MSMOW,3370,356,Mari Delgado,143.8089779196874,-37.182938473474394 +WT3370DKBYO,3370,356,Marsha Lafontant,143.92452478216035,-37.32455602225237 +WT3673HXZDV,3673,346,June Matteson,145.99560167654946,-36.51826050506983 +WT3673LHTGB,3673,346,Casandra Rodriquez,146.02864301781875,-36.57846222401271 +WT3673UDUWK,3673,346,Gertrude Charpentier,146.064080962777,-36.511711112290506 +WT3673IJRGA,3673,346,Tanya Boteilho,145.97689883082307,-36.70047256228652 +WT3673KVXLO,3673,346,Victor Haile,146.07246915022156,-36.42624843930229 +WT3610MARUH,3610,1712,John Cusumano,145.24019365423268,-36.65840158975186 +WT3831YJUPB,3831,1702,Scott Veliz,146.00129171085706,-37.97936717756665 +WT3281EZDKH,3281,1699,Barb Alton,142.45791213214864,-38.324298992639996 +WT3341XDEDB,3341,1663,Bernice Horner,144.29663463772837,-37.547884095619004 +WT3943EYMAH,3943,398,Sarah Lugo,144.72331044507223,-38.34139968469118 +WT3943KMLNK,3943,398,John Altman,144.72863720419917,-38.35664412958081 +WT3943FFEHH,3943,398,Floyd Mcfaul,144.7219219690698,-38.32665967904324 +WT3943HZQVK,3943,398,Alfred Turner,144.72713263386783,-38.36231659526328 +WT3091FDFST,3091,1588,Rebecca Stancliff,145.12240125110986,-37.635405529674266 +WT3272EWWHF,3272,769,Roger Anderson,142.71401463123493,-38.038851279666154 +WT3272BKXQG,3272,769,Lisa Sharpe,142.87016774545785,-37.88947223980726 +WT3763VATKY,3763,1536,Paul Taylor,145.33572339168677,-37.5146098951901 +WT3987SSZNL,3987,763,Eddie Rodriguez,145.61566941393843,-38.34242759790382 +WT3987IUCAW,3987,763,Nicole Jordan,145.6632481473161,-38.312568530431655 +WT3937DRRVK,3937,762,Tena Colicchio,145.00744278357038,-38.40617376495124 +WT3937YBAGH,3937,762,Tyesha Evans,145.0385876851752,-38.37262744294901 +WT3786EFOMB,3786,506,Donald Thomas,145.34487882758629,-37.874609030786985 +WT3786QKGRU,3786,506,Joe Pulaski,145.33261178176102,-37.876147897332174 +WT3786NFEXM,3786,506,Valarie Ladd,145.33896749059468,-37.86280807124825 +WT3321SLUNV,3321,759,Kim Olenius,143.98429332391092,-38.13055706695252 +WT3321FSNXX,3321,759,James Mcintosh,144.00220559674338,-38.10453080180178 +WT3904PAGSD,3904,1449,Joseph Guers,147.8814230103012,-37.85756287851035 +WT3097XJCTL,3097,288,Patricia Radune,145.18364275759183,-37.71865897605492 +WT3097RLMTE,3097,288,Lois Vranicar,145.18340474023532,-37.691368332589334 +WT3097ZVIBG,3097,288,Timothy Long,145.227096255893,-37.689580404553084 +WT3097QGSQV,3097,288,Michael Leedom,145.22873765767582,-37.66981369714856 +WT3097XAVZR,3097,288,Shelby Harlow,145.25409838935127,-37.72006745411789 +WT3517QWJOG,3517,710,Sharon Smith,143.824028691537,-36.45599339449958 +WT3517YLCTS,3517,710,Andres Stringer,143.9658753397074,-36.528924885229124 +WT3283LERNB,3283,1361,Robert Boyd,142.41367175900947,-38.3036671283345 +WT3669LSORM,3669,334,Patrick Thomas,145.6479454315831,-36.432169618935255 +WT3669OUWTC,3669,334,Terry Shirley,145.69151489086724,-36.46735851543632 +WT3669WHCWK,3669,334,Roxanne Fraley,145.9451171985405,-36.701771376792436 +WT3669MKTAQ,3669,334,James Fonville,145.55145500006822,-36.60076811195746 +WT3441YNOKN,3441,1335,Cynthia Collman,144.57328440300623,-37.40159541228774 +WT3211MCZAU,3211,440,Gary Ponce,144.41026041034422,-37.94191633053165 +WT3211QYZTL,3211,440,Tom Shaver,144.37026865605213,-37.917644151712125 +WT3211WIQQD,3211,440,David Cross,144.52883112609675,-37.86741720379371 +WT3518SVOUH,3518,1306,Mindy Degeorge,143.59564436938143,-36.16549139553198 +WT3525PNKTT,3525,433,David Maxwell,143.51297721469035,-36.23605115989298 +WT3525YPKBW,3525,433,Denise Roberts,143.32090727836928,-36.14524876420747 +WT3525SFNVO,3525,433,Arthur Raisor,143.66354165987724,-36.267518688911686 +WT3490QZBIL,3490,1293,Eldon Thompson,142.0920751388341,-35.6294349028439 +WT3231VKTTU,3231,418,Karl Evans,143.99174248566703,-38.47241568127852 +WT3231LJTGE,3231,418,Jeffrey Yeary,144.01750189333376,-38.47277891942741 +WT3231YSKOO,3231,418,Leontine Mcghee,144.07128861030645,-38.416049306559025 +WT3767ILZMN,3767,1251,Maryann Kay,145.33373257999517,-37.853257590233525 +WT3795WSZUM,3795,1246,Alex Hawkins,145.4072514306909,-37.82187487192302 +WT3766LGYUJ,3766,619,Carol Macduff,145.40485438162457,-37.81390686762836 +WT3766LYICC,3766,619,Gary Evans,145.3953639008541,-37.81880414343826 +WT3641BTUYG,3641,1238,Lamar Lozano,145.34836367023766,-35.8424059383367 +WT3688ZTAMY,3688,618,Roberta Brown,146.64108713010882,-36.21921388508445 +WT3688CBCFE,3688,618,Benny Cook,146.81185337352275,-36.15314574756163 +WT3381NFBPE,3381,151,Daniel Acosta,142.57351080319467,-37.04393698486994 +WT3381EFBIQ,3381,151,Dale Garcia,142.46965139909298,-37.05217061975479 +WT3381APGKW,3381,151,James Larsen,142.77985200882904,-37.01354991648296 +WT3381LWKCT,3381,151,Le Gomez,142.51840302060043,-37.258945692835056 +WT3381FUDIA,3381,151,Penny Carrier,142.7602629758581,-37.02897861269415 +WT3381FKFEZ,3381,151,Elmer Griffin,142.44911391594928,-37.02476536916137 +WT3381JVYWT,3381,151,Sandra Chevarie,142.40497301204525,-37.307592633147635 +WT3381KVHUF,3381,151,Margaret Fox,142.49653441432633,-37.19416819289613 +WT3301HQZAE,3301,605,Kim Keane,142.07239211135584,-37.77700323607221 +WT3301IQFNG,3301,605,Steve Rone,141.75627170931074,-37.68817872288948 +WT3285WNGGS,3285,1207,Ora Clifton,142.14470166633348,-38.314831012426886 +WT3467JKMEF,3467,397,Manuel Abnet,143.4924702806275,-37.15209600675481 +WT3467QUKAH,3467,397,Amy Robinson,143.47318345426046,-37.11545995836594 +WT3467LHHIZ,3467,397,Richard Griffin,143.50261220117957,-37.088347582968815 +WT3462DADMQ,3462,1173,Nancy Campbell,144.1374812658229,-37.131271621789665 +WT3959PMBNZ,3959,1151,Vicki Lee,146.0821758736516,-38.66933499929393 +WT3699BGPTB,3699,562,Thelma Williams,147.21459978695535,-36.82083098907771 +WT3699OPGQD,3699,562,Barbara Nguyen,147.1863486785373,-36.846367157772164 +WT3232GSLYH,3232,1114,Joshua Sickafoose,143.96111969797116,-38.544885004427805 +WT3933UXXXP,3933,549,Shaun Guffey,145.11706009902144,-38.26228415412558 +WT3933WXYJR,3933,549,Zachary Goza,145.07665783689336,-38.27000418539565 +WT3882QOVKL,3882,365,Debbie Boulos,147.77884723369948,-37.81310504617672 +WT3882ISHVI,3882,365,Shawn Muzzy,147.7937207999227,-37.840668321486035 +WT3882RGSSA,3882,365,Phillis Schuch,147.75579639334276,-37.856665808632705 +WT3701KWYIQ,3701,269,Martha Moore,147.39302957919313,-36.254894160169314 +WT3701XMJIG,3701,269,Mark Hicks,147.26723354921847,-36.1746908422996 +WT3701TPSEH,3701,269,Grant Kennedy,147.41241338695838,-36.74234154193107 +WT3701BLODZ,3701,269,William Spann,147.34749326796666,-36.82949780524 +WT3662ATDOV,3662,1078,Paul Ellis,145.08873224471094,-36.99108812380201 +WT3740IECZM,3740,1072,Michael Perez,146.9217522241385,-36.64629473417421 +WT3664SWXIM,3664,535,Marty Irons,145.4213559345688,-36.857283583008325 +WT3664EILRT,3664,535,Maryanne Lynn,145.42161318959032,-36.93788737288042 +WT3792SKYCB,3792,1065,Colby Doyle,145.39881601029296,-37.88635098026027 +WT3787KIMNH,3787,1062,Betty Sampson,145.36358060721886,-37.859543841581385 +WT3759ICVDE,3759,1062,Iva Molnar,145.23297999967573,-37.626872567426965 +WT3537EGSDE,3537,521,Laurie Martines,143.50920947939483,-35.998732241775734 +WT3537GDZFE,3537,521,Sherry Peake,143.56406500234263,-36.06556086383777 +WT3312BCEJQ,3312,1031,Alexandra Ratzlaff,141.38649875710092,-37.85213620536482 +WT3446VQPAV,3446,512,Cassandra Adami,144.41009345156795,-37.21333938617653 +WT3446LXAKM,3446,512,Maria Lyons,144.40737884448492,-37.18383196399772 +WT3713OZEIC,3713,1024,Ann Salinas,146.01557433114024,-37.27115481963977 +WT3332FSCDK,3332,338,Henry Kirkpatrick,144.15091810265923,-37.97466704460513 +WT3332WMOFU,3332,338,Ramon Clark,144.15772536670477,-37.92915238792948 +WT3332VSYVL,3332,338,Charles Koons,144.08742265383532,-37.906318691909874 +WT3988UFLKM,3988,999,Gregory Dugue,145.83757759657212,-38.26137977472963 +WT3640IJEAX,3640,498,Craig January,145.5623845411036,-35.9526679524584 +WT3640AAQGU,3640,498,Carl Ivory,145.48523912123903,-35.955725710715924 +WT3371TKLWD,3371,198,Rosie Balmes,143.780979766201,-37.140381147308865 +WT3371LQPJM,3371,198,Charles Guthrie,143.5878223789721,-37.27909863207194 +WT3371NRCNH,3371,198,Carlos French,143.54129436868953,-37.19169269131555 +WT3371EDHJW,3371,198,Maria Mccormick,143.6987549405334,-37.15966454310564 +WT3371FSXOU,3371,198,Stephen Fuger,143.58227223810064,-37.22182937861386 +WT3856LZQQX,3856,494,Harold Clark,146.5747956840559,-38.097273979739455 +WT3856VWUCE,3856,494,Calvin Peters,146.66966584752493,-38.0660779657233 +WT3822UTLBA,3822,328,Martha Cantell,145.97078430963745,-38.259788295528516 +WT3822ZUESE,3822,328,Vera Trujillo,145.9732567826071,-38.19320356727584 +WT3822SCXUE,3822,328,Olivia Kealoha,146.0445194647736,-38.21652931863321 +WT3294HMRGS,3294,959,Donna Hunt,142.41033479433978,-37.72739513117154 +WT3558YVRNF,3558,913,Shirley Mercier,144.46934774099876,-36.38961409239029 +WT3390MNEYB,3390,910,Russel Oneal,142.36556277404844,-36.671526631248994 +WT3929QUHGX,3929,301,Reta Dear,144.98217411069476,-38.478207718155254 +WT3929CVLPY,3929,301,Teresa Lombard,144.99612255072378,-38.4979018760139 +WT3929GAEUY,3929,301,Peter Boucher,144.99946764003946,-38.49461270629174 +WT3623KCHIQ,3623,224,Melissa Nunes,144.99128880433005,-36.493622465866466 +WT3623WHBOP,3623,224,Bonnie Griffin,144.86245373284606,-36.474061581880534 +WT3623CXKIC,3623,224,Rebecca Lara,144.90863570166192,-36.44103547317975 +WT3623PQJJL,3623,224,Brian Rivera,144.93257396622488,-36.45881766189839 +WT3483GYMPZ,3483,889,Shelia Atchity,142.93205811082646,-36.05104462124199 +WT3614FEUFX,3614,294,Linda Horne,145.30264231019854,-36.4423853259039 +WT3614TGMTF,3614,294,Thomas Hewitt,145.35183639969586,-36.454342723111374 +WT3614RPLDA,3614,294,Wendy Allen,145.33384555608592,-36.4847281162463 +WT3448IZIRK,3448,219,Danny Warden,144.42675511297,-37.1004559272066 +WT3448TCXAB,3448,219,Alvin Christensen,144.46845561469266,-36.99469651360088 +WT3448ARUDG,3448,219,Rebecca Gunn,144.2952391849277,-37.02554168504665 +WT3448QJBPL,3448,219,Nancy Bourgeois,144.4400794084072,-37.02794896145388 +WT3859EZZZF,3859,417,Mario West,146.874863527595,-37.938145839726175 +WT3859ROSCD,3859,417,James Kraft,146.81360775199434,-37.88569149405884 +WT3586GOKYH,3586,165,Susan Franca,143.4114445342641,-35.34326592695904 +WT3586UIYSX,3586,165,Susan Brown,143.57551704336663,-35.43013773186777 +WT3586DQTFQ,3586,165,Gail Snover,143.52329381464426,-35.414334958371455 +WT3586VLTHI,3586,165,Daryl Harrell,143.76386533809153,-35.382522017008526 +WT3586HJCAB,3586,165,Jon Pugh,143.77782006156744,-35.39881527530966 +WT3242RMIRO,3242,828,Mary Schmidt,143.9191635258242,-38.39211400505958 +WT3575LOVVV,3575,811,Bernice Crislip,143.8999537630559,-36.06222052471251 +WT3563ASTZV,3563,808,Donald Cressey,144.50286713872708,-36.253027303203616 +WT3379FSQNH,3379,803,Alvin Mccary,142.61984441180218,-37.452582014092336 +WT3557JZEBK,3557,785,Gina Jennings,144.61554898220922,-36.65260697492854 +WT3424UWBOM,3424,769,Lester Schneider,141.75360935510537,-35.60080608600458 +WT3289ZSWDS,3289,378,Kim Hall,142.1760506248015,-37.83343114690931 +WT3289KLENK,3289,378,Scott Paxson,142.28573388657216,-37.83036916681455 +WT3570CVYRO,3570,753,Lynne Mcduffie,144.27083702467118,-36.56979567964781 +WT3903XNRPU,3903,375,David Chaffins,147.83349993193158,-37.77168886119082 +WT3903AHDFU,3903,375,Alvin Alston,147.8407936942637,-37.81399186326522 +WT3221FUGFU,3221,749,Ebony Greer,144.20712718877473,-38.181166391894756 +WT3269FLZCI,3269,730,Sheila Mittler,143.10357781739555,-38.68274455859186 +WT3618RGICZ,3618,679,James Stratton,145.1127245252079,-36.372828222096814 +WT3521QXPYY,3521,165,Mary Carrasquillo,144.82504468668296,-37.05788569846151 +WT3521WLRVZ,3521,165,James Greenhalge,144.88270784822402,-37.10383461348541 +WT3521GHFHW,3521,165,Angela Jones,144.8091641663201,-37.051119435689564 +WT3521LJVFX,3521,165,Dale Cruz,144.82351825298568,-37.05283262770906 +WT3728VTOCE,3728,318,Michael Figueras,145.8609999063205,-36.148397616739054 +WT3728YZARW,3728,318,Heather Cummings,145.8168813215635,-36.115027477064245 +WT3633ADDYP,3633,201,Deborah Martin,145.45189447672618,-36.32463899149619 +WT3633WGRXB,3633,201,John Miller,145.48023893751045,-36.2875408553956 +WT3633UVHAO,3633,201,Michael Price,145.51505172180683,-36.31027112244356 +WT3637QUAPC,3637,198,Ronald Gibbs,145.24933488454735,-36.07351008853829 +WT3637KIERO,3637,198,Robert Dow,145.25553090556156,-36.0980796504903 +WT3637KCRBJ,3637,198,Dana Johannes,145.32391744928637,-36.06210732031904 +WT3646ODVHA,3646,292,Cole Garcia,145.72326135638744,-36.3884929080724 +WT3646YIARV,3646,292,Howard Adams,145.77244775588534,-36.106477847410545 +WT3392VMHPA,3392,193,Joe Howland,142.70728416780486,-36.424373130494224 +WT3392RTNTS,3392,193,Patricia Duke,142.52997970845823,-36.51024904610308 +WT3392CNJDX,3392,193,John Kruse,142.519200725167,-36.43207553003609 +WT3697NJLRT,3697,574,Lorene Adams,147.23509092899965,-36.704761090934205 +WT3063WZIQE,3063,114,James Miller,144.81061694155076,-37.553501843305575 +WT3063NRXLC,3063,114,Mildred Emery,144.85870579519653,-37.631183636401495 +WT3063BAQSG,3063,114,Kerrie Muirhead,144.8477001027189,-37.61411556432888 +WT3063SHXWL,3063,114,Jacquline Gaines,144.81431667022454,-37.548448007191524 +WT3063QANBA,3063,114,Andres Hargrove,144.8675269613745,-37.63311112075561 +WT3670PLGJW,3670,286,Amanda Rances,145.8543049782779,-36.550195914629086 +WT3670UZILW,3670,286,Alice Mount,145.90035402413275,-36.755461658470594 +WT3720INUUX,3720,142,Lydia Wake,145.85093034310947,-36.99680023507143 +WT3720MGCOZ,3720,142,Ronald Geathers,145.92574211977552,-37.04513194445374 +WT3720QRVEC,3720,142,Jason Martinez,145.94225200441355,-36.97990296994957 +WT3720PRDQD,3720,142,Brittany Figueroa,145.8909095827922,-37.08158784283176 +WT3334SWQXD,3334,141,Leslie Wilson,143.93533026459232,-37.82415532680082 +WT3334GGKOS,3334,141,Elizabet Benson,144.1621690362788,-37.67891238372265 +WT3334ZGRIM,3334,141,Danielle Aguilar,143.93613908439136,-37.71479341440412 +WT3334URENZ,3334,141,Laura Cooley,143.97291721158282,-37.70444310411927 +WT3874BQSHG,3874,558,Danny Davis,146.8929785569054,-38.63429799594603 +WT3566XFFVH,3566,275,Katherine Rances,144.38029622131242,-35.94210216676543 +WT3566TZUNA,3566,275,Jane Riherd,144.27256575931622,-35.96498437670641 +WT3384SCVXJ,3384,547,Mattie English,142.82570937595798,-36.86424828187021 +WT3594VFWKC,3594,265,Maria Wyatt,143.36980614046337,-35.13689286142818 +WT3594HMRHI,3594,265,Regina Stevenson,143.36144293860465,-35.139081004061744 +WT3324PZTHD,3324,529,Ray Hunt,143.37848595547797,-37.83035948043598 +WT3314MSPDH,3314,262,Kristopher Dillis,142.49428100466025,-37.42945996656578 +WT3314MMCAP,3314,262,Brenda Hier,142.24619966833797,-37.241569389454305 +WT3251FUJSG,3251,522,Lisa Voegele,143.5797389397756,-38.1623931117428 +WT3385SBYHN,3385,517,Jose Muscarella,142.4769673818804,-36.72879804542957 +WT3966FVIXR,3966,511,Nicholas Jones,146.3860642910803,-38.632532172146895 +WT3944IPDXM,3944,510,Bea Perkins,144.69467580157874,-38.30821085492802 +WT3711ZTDQC,3711,492,Michelle Henkel,145.72069644231422,-37.38843622880619 +WT3276GCLGU,3276,482,John Malbon,142.4392854535207,-38.19894008452885 +WT3695LTWEX,3695,471,Brian Manson,147.12812637330472,-36.43015576164423 +WT3622PSQCL,3622,457,Michael Johnson,144.86970237771936,-36.28586503033871 +WT3744AERRG,3744,453,Wanda Winger,147.02260359868137,-36.843450219388366 +WT3865KWBMJ,3865,449,Danielle Zeigler,147.47135719889891,-37.7878966294349 +WT3649NJHAF,3649,86,Catherine Ortiz,145.70444412227315,-36.12591041370753 +WT3649FZBJW,3649,86,Randy Reis,145.71663028775822,-36.09467058803647 +WT3649QHCBG,3649,86,Catherine Martinez,145.7410820492848,-36.08027704542416 +WT3649VOFAD,3649,86,Robert Stephenson,145.73206798467282,-36.091294892789826 +WT3649HAFSM,3649,86,Pauline Moye,145.70978060583693,-36.016821302693344 +WT3287GNYUZ,3287,216,Gregory Robertson,142.22590342509568,-37.982341386004684 +WT3287NEKVB,3287,216,Joel Simmons,142.26305043381535,-37.983480961999916 +WT3239MBYZA,3239,212,Richard Ashby,143.47124816171566,-38.500937875544096 +WT3239YKAGQ,3239,212,Juliet Squires,143.44503520183875,-38.600327542945436 +WT3407PYOAR,3407,420,Gale Martin,141.83324586447986,-37.2859635851256 +WT3597QYEPE,3597,138,Bill Boardman,143.05015816797393,-35.057893670531236 +WT3597EWQEE,3597,138,Barbara Prater,142.93959851974742,-34.79055186433574 +WT3597ERXFD,3597,138,Jeffrey Wassermann,143.05218418696776,-34.748219582967735 +WT3954ZMCUG,3954,404,Virginia Craig,145.94579609352263,-38.592514028809966 +WT3779GWEUZ,3779,197,Heather Hamilton,145.95958275948624,-37.592625406209436 +WT3779NULEK,3779,197,Aida Kuhnle,146.11080887018696,-37.67951918079387 +WT3886ESDHQ,3886,194,Grace Cheeseman,148.468952000646,-37.74203564053428 +WT3886TTZGX,3886,194,Andrew Gallaher,148.45433415685554,-37.76042025038381 +WT3302YQSRD,3302,371,Janet Wuertz,141.70903116268366,-37.77041636441886 +WT3760NWWQM,3760,123,Christina Barnes,145.2537632355421,-37.61222515067956 +WT3760NSMCA,3760,123,Dave Harris,145.27915408932998,-37.62392370581628 +WT3760OIPAO,3760,123,Donnie Washington,145.28420018561462,-37.60539948948486 +WT3719TVVJM,3719,122,Brent Bautista,145.6864773045679,-37.03188286944955 +WT3719OORYW,3719,122,Basil Perkins,145.58228061500017,-37.04599105764248 +WT3719HLABD,3719,122,Alfred Too,145.52985920519603,-36.964844896202216 +WT3395ZFRTI,3395,364,Eileen Smith,142.22894607727852,-35.890065275630576 +WT3588WVCMU,3588,356,Lester Buford,143.4217950256489,-35.299755264328425 +WT3475CCCXF,3475,172,Laura Martin,143.57488363090826,-36.85185108205203 +WT3475GQDOE,3475,172,Stacy Tatsch,143.46966058558894,-36.668195411179134 +WT3319JVPPC,3319,344,Brian Beebe,141.22543417362317,-37.012182939250735 +WT3887NLNSJ,3887,342,Lorene Anderson,147.96080438424718,-37.76269836557282 +WT3522OQJSC,3522,169,Michael Walston,144.74940885106298,-36.97742678178455 +WT3522OJRGT,3522,169,Kathy Wilkerson,144.74300595564944,-36.97382390728314 +WT3573ITNEH,3573,111,Sarah Batts,144.4134357014596,-36.25351364792508 +WT3573DPVGU,3573,111,Wiley Palmer,144.15009214850954,-36.12318035418112 +WT3573USMYF,3573,111,Mamie Jimenez,144.47307368498045,-36.29128543237728 +WT3890YMWXJ,3890,324,Floyd Lopez,149.26497677490372,-37.448441010677136 +WT3873DKJEX,3873,80,David Whitaker,146.6834436511048,-38.27461997132981 +WT3873TVISD,3873,80,Joseph Richard,146.74366652248028,-38.24447649607425 +WT3873ESEXR,3873,80,James Nardone,146.73243514870416,-38.26862296306848 +WT3873JWNLL,3873,80,Philip Sanchez,146.76425315494552,-38.248738772189654 +WT3979RQAKR,3979,160,Joe Wilson,145.63102371227131,-38.49742283359791 +WT3979UJRXF,3979,160,David Behrens,145.61944713831397,-38.42753872026658 +WT3430SRBOM,3430,320,Deidre Blain,144.717823619539,-37.45002826162372 +WT3571ITSUB,3571,318,Francis Orphey,144.16883497681675,-36.34875486142471 +WT3387TTBDC,3387,312,James Cunningham,143.01913490844026,-36.98457015456603 +WT3254RXAVL,3254,310,Amy Pugh,143.54387071993327,-38.308515316326016 +WT3833BOMRB,3833,307,Margie Green,146.11666404368856,-37.95726898277424 +WT3293SQKBY,3293,100,Shawn Clark,142.64808203542347,-37.82556647618436 +WT3293OKFUP,3293,100,Linda Cook,142.64917955102206,-37.68950303741661 +WT3293BUTCN,3293,100,Micheal Henriquez,142.41365868994518,-37.73003361911264 +WT3412EUBAQ,3412,149,Cynthia Nicoletti,141.52249483530403,-36.79192850555632 +WT3412CTRWX,3412,149,Ashley Bentley,141.42125500515377,-36.6188353776219 +WT3709NIYXZ,3709,145,William Stevens,147.82220549758904,-35.997592594813014 +WT3709SKIHY,3709,145,Johnetta Jackson,147.58945926383643,-35.98810924750853 +WT3468HOPGM,3468,286,Melissa Cole,143.46879167665466,-37.2505147471354 +WT3329YEZVS,3329,142,Nina Johnson,144.00191832187895,-37.91819500282096 +WT3329RYDXT,3329,142,Dean Hicks,143.87956511815653,-38.03900204899043 +WT3562YUGDU,3562,279,Micah Rodriguez,144.4588804257186,-36.05511756014117 +WT3310PQUBW,3310,276,Bessie Simons,141.48832395314227,-37.74358845249581 +WT3958YCZYE,3958,272,Wm Denton,146.02010324860865,-38.69545657583797 +WT3789TMNJY,3789,265,Roger Spencer,145.35001082455108,-37.876336921811706 +WT3755OIDFJ,3755,252,Diana Taylor,145.1535820920967,-37.55849215079668 +WT3270DXNQH,3270,123,Sabrina Brantley,142.86652199719225,-38.552328853487055 +WT3270VYPYQ,3270,123,Raymond Sutton,142.8318286564251,-38.61411835259919 +WT3832NHOOV,3832,247,Bryan Warren,146.0154412945935,-37.93424551655733 +WT3738LQTCS,3738,219,James Wareham,146.77993124287363,-36.57772232481024 +WT3238BOTYW,3238,72,Bernard Jackson,143.567776369521,-38.625836774939955 +WT3238EGMOA,3238,72,George Brown,143.33872080562963,-38.799580856292664 +WT3238MCUPV,3238,72,Nellie Banks,143.56196753560545,-38.82942446565583 +WT3330SFSQV,3330,217,Alyssa Johnson,143.80666515091974,-37.972463547396835 +WT3864DBQMJ,3864,217,Geraldine Martinez,147.35297667088736,-37.92523989104278 +WT3733ZRFXX,3733,215,John Horton,146.43418373847857,-36.78838281077019 +WT3237XOZIG,3237,107,Barbara Watson,143.62294302711948,-38.700688751493466 +WT3237WECQF,3237,107,Pedro Mcleod,143.69206910321378,-38.75856130842859 +WT3583QHCKS,3583,209,Cynthia Brewer,143.66859933252738,-35.5299230143342 +WT3946JOFXE,3946,104,Jan Goodrich,145.7192956876138,-38.43764463690359 +WT3946CHDDQ,3946,104,Mary Johnson,145.78267527312724,-38.43639382834139 +WT3375ORFQU,3375,104,Heidi Limon,143.26000015058494,-37.45880281030328 +WT3375LAJLR,3375,104,Emma Boatwright,143.2980117885972,-37.372200644973155 +WT3292RYQHY,3292,190,Neal Martenez,141.21340675084443,-38.13998929798788 +WT3234WWIFA,3234,90,Latanya Hurst,143.75317875173945,-38.613627563528 +WT3234FPGRT,3234,90,Erin Sanchez,143.87128178598107,-38.70268409082685 +WT3391MXURJ,3391,171,Vivian Holmes,142.5847058735757,-36.06961633939022 +WT3581BHSJW,3581,56,Paul Peterson,143.7535102911311,-35.54628594217159 +WT3581ARKZP,3581,56,Michael Auerswald,143.82631327926745,-35.554401104359 +WT3581IXSCV,3581,56,April Long,143.84395469583112,-35.58177315955131 +WT3572UOOQX,3572,75,Britt Williams,144.30582272820246,-36.3147946744435 +WT3572QKNMX,3572,75,Bobbie Alexander,144.23297168893794,-36.37549543758321 +WT3900UYGLE,3900,149,Denise Russell,147.5972713074322,-36.73959902169322 +WT3273HFRKB,3273,143,Annie Hastings,142.68415340600552,-37.993411346930365 +WT3491DTDPG,3491,133,George Olsen,142.19708518735555,-35.5526826141909 +WT3599BUOIB,3599,33,Angela Jackson,143.1787280374593,-34.77449866594533 +WT3599SCILO,3599,33,Bernadette Macaraeg,143.01577439228708,-34.78811837449265 +WT3599SSPTZ,3599,33,Jack Taylor,143.2051140200742,-34.710205812295726 +WT3599DVPAN,3599,33,Rebecca Rigsby,143.19753271424213,-34.70506108206721 +WT3607QVZKZ,3607,131,Ellen Gipson,145.1609195787148,-36.82109281259211 +WT3762TBMLS,3762,131,Stephanie Gonzalez,144.88717572676498,-37.33492122205464 +WT3530RJWDT,3530,63,Troy Clark,143.0834668479817,-35.79299394885817 +WT3530IMHIL,3530,63,Doug Nunez,143.19563418135533,-35.757657382224984 +WT3309UAHAX,3309,124,Bobby Andrews,141.5652819683202,-37.83789015425547 +WT3891DIUYN,3891,35,Steven Turcotte,149.74040967732958,-37.74088000886122 +WT3891OXFAK,3891,35,Veronica Smith,149.6383698678278,-37.31385347266344 +WT3891YZEFQ,3891,35,Gary Derrico,149.4334448701031,-37.688995526090274 +WT3596HBEUF,3596,47,Jose Robertson,143.15095468769667,-35.190473662123345 +WT3596ZAMTX,3596,47,Gregory Booth,143.18925722392484,-35.14344453095626 +WT3852UXZYD,3852,46,Judy Horn,147.15539385937802,-38.114047049214356 +WT3852IRDFY,3852,46,Stephanie Stewart,147.11972466828865,-38.11059906774082 +WT3487ZDAIO,3487,46,Faye Troy,142.54705121608765,-35.6169222609149 +WT3487DIBUX,3487,46,Bette Freeze,142.55489446874185,-35.641735681282626 +WT3026TCTQH,3026,73,Richard Grosvenor,144.81637725224323,-37.821627544175726 +WT3718PAMXL,3718,72,Richard Evans,145.5172622664395,-37.168664167586044 diff --git a/ed.supp b/test/ed.supp similarity index 100% rename from ed.supp rename to test/ed.supp diff --git a/towers.o b/towers.o deleted file mode 100644 index f4723f3..0000000 Binary files a/towers.o and /dev/null differ diff --git a/voronoi.o b/voronoi.o deleted file mode 100644 index 343e528..0000000 Binary files a/voronoi.o and /dev/null differ diff --git a/voronoi2 b/voronoi2 deleted file mode 100755 index 440544b..0000000 Binary files a/voronoi2 and /dev/null differ