Creating, Positioning, and Rotating Rectangles Using C++

Similar documents
Uniform Tests of File Converters Using Unit Cubes

Android: Call C Functions with the Native Development Kit (NDK)

NATO-IST-124 Experimentation Instructions

Army Research Laboratory

Generating Pseudorandom Numbers From Various Distributions Using C++

Instructions for Installing digibase Plug-in on a Terra Harvest Controller

ARL Eye Safer Fiber Laser Testbed LabView Automation and Control

TrafficGen Architecture Document

Hand Gesture Data Collection Procedure Using a Myo Armband for Machine Learning

An Alternative Representation of a Simulated Human Body

A Customizable and Expandable Electroencephalography (EEG) Data Collection System

Real-Time Visualization System for Computational Offloading

Use of Modal Analysis and Surrogate Solution Surfaces to Analyze and Assess Adaptive Autonomous Systems

Procedure for Surveying a Station in the U.S. Army Research Laboratory Transonic Experimental Facility Spark Shadowgraph Range

WAITING ON MORE THAN 64 HANDLES

Calculating Drag Coefficients for Spheres and Other Shapes Using C++

Converting Between PLY and Ballistic Research Laboratory Computer-Aided Design (BRL-CAD) File Formats

DoD Common Access Card Information Brief. Smart Card Project Managers Group

NETGEAR ProSAFE M4300 Series 10-GbE Switch Tutorial

An Extensible NetLogo Model for Visualizing Message Routing Protocols

COMPUTATIONAL FLUID DYNAMICS (CFD) ANALYSIS AND DEVELOPMENT OF HALON- REPLACEMENT FIRE EXTINGUISHING SYSTEMS (PHASE II)

Multi-Modal Communication

Dependency Tree Annotation Software

Traffic Generator (TrafficGen) Version 1.4.2: User s Guide

FUDSChem. Brian Jordan With the assistance of Deb Walker. Formerly Used Defense Site Chemistry Database. USACE-Albuquerque District.

A Practical Application of the Computational Science Environment (CSE)

Architecting for Resiliency Army s Common Operating Environment (COE) SERC

OpenFlow Extensions for Programmable Quantum Networks

Using Model-Theoretic Invariants for Semantic Integration. Michael Gruninger NIST / Institute for Systems Research University of Maryland

Energy on Target Analysis for Laser Designators

Service Level Agreements: An Approach to Software Lifecycle Management. CDR Leonard Gaines Naval Supply Systems Command 29 January 2003

Accuracy of Computed Water Surface Profiles

The Battlefield Environment Division Modeling Framework (BMF) Part II: Serial and Parallel Output Enhancements

Cloud Migration Experiment Configuration and Results

Empirically Based Analysis: The DDoS Case

Vision Protection Army Technology Objective (ATO) Overview for GVSET VIP Day. Sensors from Laser Weapons Date: 17 Jul 09 UNCLASSIFIED

Visualization of a Text Network Structure Using X3D

Dana Sinno MIT Lincoln Laboratory 244 Wood Street Lexington, MA phone:

TARGET IMPACT DETECTION ALGORITHM USING COMPUTER-AIDED DESIGN (CAD) MODEL GEOMETRY

Interference Cancellation System Design Using GNU Radio

Running CyberCIEGE on Linux without Windows

4. Lessons Learned in Introducing MBSE: 2009 to 2012

Chemical Biological Material Effects Database New User Guide

Design Report for Isolated RS-485 Bus Node

Analysis of the Pan-Tilt-Zoom Consistency of a Sony SNC-RZ30N Camera

Network Science Research Laboratory (NSRL) Discrete Event Toolkit

Feature Extraction of High-Dimensional Structures for Exploratory Analytics

Information, Decision, & Complex Networks AFOSR/RTC Overview

Adapting My Weather Impacts Decision Aid (MyWIDA) to Additional Web Application Server Technologies

Laboratory Assessment of Commercially Available Ultrasonic Rangefinders

US Army Research Laboratory Visualization Framework Architecture Document

Washington University

Approaches to Improving Transmon Qubits

HEC-FFA Flood Frequency Analysis

ARINC653 AADL Annex Update

Drawing One-Hop Links Using the Common Open Research Emulator (CORE) Service

ASSESSMENT OF A BAYESIAN MODEL AND TEST VALIDATION METHOD

A Communication Protocol for CyAMS and the Cyber Fighter Associate Interface

Setup Instructions for the Applied Anomaly Detection Tool (AADT) Web Server

High-Assurance Security/Safety on HPEC Systems: an Oxymoron?

Basing a Modeling Environment on a General Purpose Theorem Prover

Kathleen Fisher Program Manager, Information Innovation Office

Calibration of an Orthogonal Cluster of Magnetic Sensors

Lessons Learned in Adapting a Software System to a Micro Computer

Monte Carlo Techniques for Estimating Power in Aircraft T&E Tests. Todd Remund Dr. William Kitto EDWARDS AFB, CA. July 2011

Design of a Percussion and Electric Primer Gun Firing Power Supply

MODELING AND SIMULATION OF LIQUID MOLDING PROCESSES. Pavel Simacek Center for Composite Materials University of Delaware

U.S. Army Research, Development and Engineering Command (IDAS) Briefer: Jason Morse ARMED Team Leader Ground System Survivability, TARDEC

NEW FINITE ELEMENT / MULTIBODY SYSTEM ALGORITHM FOR MODELING FLEXIBLE TRACKED VEHICLES

ENVIRONMENTAL MANAGEMENT SYSTEM WEB SITE (EMSWeb)

ARL-TR-7411 SEP US Army Research Laboratory

Space and Missile Systems Center

Towards a Formal Pedigree Ontology for Level-One Sensor Fusion

Distributed Real-Time Embedded Video Processing

2013 US State of Cybercrime Survey

Stereo Vision Inside Tire

SURVIVABILITY ENHANCED RUN-FLAT

Software Change-Merging in Dynamic Evolution

Setting the Standard for Real-Time Digital Signal Processing Pentek Seminar Series. Digital IF Standardization

Shallow Ocean Bottom BRDF Prediction, Modeling, and Inversion via Simulation with Surface/Volume Data Derived from X-Ray Tomography

Defense Hotline Allegations Concerning Contractor-Invoiced Travel for U.S. Army Corps of Engineers' Contracts W912DY-10-D-0014 and W912DY-10-D-0024

An Efficient Architecture for Ultra Long FFTs in FPGAs and ASICs

A Survey on Security Isolation of Virtualization, Containers, and Unikernels

A Review of the 2007 Air Force Inaugural Sustainability Report

Fast Computation on the Modern Battlefield

Wireless Connectivity of Swarms in Presence of Obstacles

VICTORY VALIDATION AN INTRODUCTION AND TECHNICAL OVERVIEW

75th Air Base Wing. Effective Data Stewarding Measures in Support of EESOH-MIS

LARGE AREA, REAL TIME INSPECTION OF ROCKET MOTORS USING A NOVEL HANDHELD ULTRASOUND CAMERA

Topology Control from Bottom to Top

Introducing I 3 CON. The Information Interpretation and Integration Conference

Guide to Windows 2000 Kerberos Settings

Experimentation with Inexpensive Internet of Things (IoT) Modules: A Thermometer Using LoRaWAN

David W. Hyde US Army Engineer Waterways Experiment Station Vicksburg, Mississippi ABSTRACT

Installing and Executing Information Object Analysis, Intent, Dissemination, and Enhancement (IOAIDE) and Its Dependencies

Postprocessing of Voxel-Based Topologies for Additive Manufacturing Using the Computational

73rd MORSS CD Cover Page UNCLASSIFIED DISCLOSURE FORM CD Presentation

Technological Advances In Emergency Management

73rd MORSS CD Cover Page UNCLASSIFIED DISCLOSURE FORM CD Presentation

A Distributed Parallel Processing System for Command and Control Imagery

Transcription:

Creating, Positioning, and Rotating Rectangles Using C++ by Robert J. Yager ARL-TN-558 August 2013 Approved for public release; distribution is unlimited.

NOTICES Disclaimers The findings in this report are not to be construed as an official Department of the Army position unless so designated by other authorized documents. Citation of manufacturer s or trade names does not constitute an official endorsement or approval of the use thereof. Destroy this report when it is no longer needed. Do not return it to the originator.

Army Research Laboratory Aberdeen Proving Ground, MD 21005-5066 ARL-TN-558 August 2013 Creating, Positioning, and Rotating Rectangles Using C++ Robert J. Yager Weapons and Materials Research Directorate, ARL Approved for public release; distribution is unlimited.

REPORT DOCUMENTATION PAGE Form Approved OMB No. 0704-0188 Public reporting burden for this collection of information is estimated to average 1 hour per response, including the time for reviewing instructions, searching existing data sources, gathering and maintaining the data needed, and completing and reviewing the collection information. Send comments regarding this burden estimate or any other aspect of this collection of information, including suggestions for reducing the burden, to Department of Defense, Washington Headquarters Services, Directorate for Information Operations and Reports (0704-0188), 1215 Jefferson Davis Highway, Suite 1204, Arlington, VA 22202-4302. Respondents should be aware that notwithstanding any other provision of law, no person shall be subject to any penalty for failing to comply with a collection of information if it does not display a currently valid OMB control number. PLEASE DO NOT RETURN YOUR FORM TO THE ABOVE ADDRESS. 1. REPORT DATE (DD-MM-YYYY) August 2013 2. REPORT TYPE Final 4. TITLE AND SUBTITLE Creating, Positioning, and Rotating Rectangles Using C++ 3. DATES COVERED (From - To) March 2013 5a. CONTRACT NUMBER 5b. GRANT NUMBER 5c. PROGRAM ELEMENT NUMBER 6. AUTHOR(S) Robert J. Yager 5d. PROJECT NUMBER AH80 5e. TASK NUMBER 5f. WORK UNIT NUMBER 7. PERFORMING ORGANIZATION NAME(S) AND ADDRESS(ES) U.S. Army Research Laboratory ATTN: RDRL-WML-A Aberdeen Proving Ground, MD 21005-5066 8. PERFORMING ORGANIZATION REPORT NUMBER ARL-TN-558 9. SPONSORING/MONITORING AGENCY NAME(S) AND ADDRESS(ES) 10. SPONSOR/MONITOR S ACRONYM(S) 11. SPONSOR/MONITOR S REPORT NUMBER(S) 12. DISTRIBUTION/AVAILABILITY STATEMENT Approved for public release; distribution is unlimited. 13. SUPPLEMENTARY NOTES 14. ABSTRACT This report documents a set of functions, written in C++, that can be used to create, position, and rotate rectangles, as well as test for intersection between rectangles. The functions build on functions from the y2dops namespace (Yager, R. J. Two- Dimensional Translations, Rotations, and Intersections Using C++: U.S. Army Research Laboratory: Aberdeen Proving Ground, MD, to be submitted for publication). The functions have been grouped into the yrectangle2d namespace, which is summarized at the end of this report. 15. SUBJECT TERMS rectangle, 2D, C++, translate, rotate, intersection, intersect 16. SECURITY CLASSIFICATION OF: REPORT Unclassified b. ABSTRACT Unclassified c. THIS PAGE Unclassified 17. LIMITATION OF ABSTRACT UU 18. NUMBER OF PAGES 24 19a. NAME OF RESPONSIBLE PERSON Robert J. Yager 19b. TELEPHONE NUMBER (Include area code) 410-278-6689 Standard Form 298 (Rev. 8/98) Prescribed by ANSI Std. Z39.18 ii

Contents List of Figures Acknowledgments v vi 1. Introduction 1 2. Rectangles in Two Dimensions 1 3. Creating Rectangles the NewRectangle2D() Function 2 3.1 NewRectangle2D() Code...2 3.2 NewRectangle2D() Parameters...2 3.3 NewRectangle2D() Return Value...3 3.4 NewRectangle2D() Example...3 4. Translating Rectangles the TranslateRectangle2D() Function 3 4.1 TranslateRectangle2D() Code...4 4.2 TranslateRectangle2D() Parameters...4 4.3 TranslateRectangle2D() Example...4 5. Rotating Rectangles the RotateRectangle2D() Function 5 5.1 RotateRectangle2D() Code...6 5.2 RotateRectangle2D() Parameters...6 5.3 RotateRectangle2D() Example...6 6. Checking for Rectangle Overlap the RectangleIntersect2D() Function 7 6.1 RectangleIntersect2D() Code...7 6.2 RectangleIntersect2D() Parameters...7 6.3 RectangleIntersect2D() Return Value...8 6.4 RectangleIntersect2D() Example...8 7. Interior/Exterior Check the RectangleInterior2D() Function 9 7.1 RectangleInterior2D() Code...9 iii

7.2 RectangleInterior2D() Parameters...9 7.2 RectangleInterior2D() Return Value...9 7.2 RectangleInterior2D() Example...10 8. Example Placing N Uniformly Distributed Rectangles in a Rectangular Region 10 9. Summary 13 Distribution List 15 iv

List of Figures Figure 1. A rectangle with corners defined by position vectors R 0, R, 1 R, and 2 R 3...1 Figure 2. A rectangle created using the NewRectangle2D() function....2 Figure 3. A rectangle that has been repositioned using the TranslateRectangle2D() function....4 Figure 4. A rectangle that has been rotated using the RotateRectangle2D() function....5 Figure 5. Intersecting rectangles: A and B intersect, A and C do not....7 Figure 6. Interior Points: P is interior to B, but not to A....9 Figure 7. N uniformly distributed rectangles....12 Figure 8. Randomly generated points that are interior to 800 uniformly distributed rectangles...12 v

Acknowledgments The author would like to thank Mr. Luke Strohm of the U.S. Army Research Laboratory s (ARL s) Weapons and Materials Research Directorate. Mr. Strohm provided technical and editorial recommendations that improved the quality of this report. vi

1. Introduction This report documents a set of functions, written in C++, that can be used to create, position, and rotate rectangles, as well as test for intersection between rectangles. The functions build on functions from the y2dops namespace. 1 The functions have been grouped into the yrectangle2d namespace, which is summarized at the end of this report. 2. Rectangles in Two Dimensions Suppose that a rectangle R is defined by four position vectors R 0, R 1, R 2, and R 3 as shown in figure 1. ŷ R 3 R 2 R 0 R 1 xˆ Figure 1. A rectangle with corners defined by position vectors R 0, R, 1 R, and 2 R 3. 1 Yager, R. J. Two-Dimensional Translations, Rotations, and Intersections Using C++; TN 539; U.S. Army Research Laboratory: Aberdeen Proving Ground, MD, June 2013. 1

The functions described in this report operate on rectangles that are stored in eight-element arrays, where an array, R, is defined such that R={ R 0, x, R 0, y, R 1, x, R 1, y, R 2, x, R 2, y, R 3, x, R, y 3 }. (1) 3. Creating Rectangles the NewRectangle2D() Function The NewRectangle2D() function can be used to create rectangles that are placed with their lower-left corners at the origin, as shown in figure 2. ŷ l w xˆ Figure 2. A rectangle created using the NewRectangle2D() function. Note that the NewRectangle2D() function uses the new command to allocate memory for the array that is pointed to by its return value. Thus, to avoid memory leaks, each use of the NewRectangle2D() function should be accompanied by a use of the delete[] operator. 3.1 NewRectangle2D() Code inline double* NewRectangle2D(//<======================CREATES A NEW RECTANGLE double w,//< WIDTH OF RECTANGLE double l){//< LENGTH OF RECTANGLE double *R=new double[8];/*< */R[0]=R[1]=R[3]=R[6]=0,R[2]=R[4]=w,R[5]=R[7]=l; return R; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 3.2 NewRectangle2D() Parameters w w specifies the width of a rectangle. 2

l l specifies the length of a rectangle. 3.3 NewRectangle2D() Return Value The NewRectangle2D() function returns a pointer to a new rectangle. 3.4 NewRectangle2D() Example The following example begins by using the NewRectangle2D() function to create a rectangle that is 2.0 units wide and 1.0 unit long. The coordinates of the corners of the rectangle are then printed to the screen. Finally, the memory that was allocated using the NewRectangle2D() function is deallocated using the delete[] command. #include <cstdio>//...printf() #include "y_rectangle_2d.h" int main(){ double* R=yRectangle2D::NewRectangle2D(2,1); printf(" x, y\n"); for(int i=0;i<4;++i)printf(" %4.1f, %4.1f\n",R[2*i],R[2*i+1]); delete[] R; };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ OUTPUT: x, y 0.0, 0.0 2.0, 0.0 2.0, 1.0 0.0, 1.0 4. Translating Rectangles the TranslateRectangle2D() Function The TranslateRectangle2D() function can be used to reposition rectangles (without rotation) by a displacement vector d, as shown in figure 3. 3

ŷ d y xˆ d x Figure 3. A rectangle that has been repositioned using the TranslateRectangle2D() function. 4.1 TranslateRectangle2D() Code inline void TranslateRectangle2D(//<====================TRANSLATES A RECTANGLE double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) const double d[2]){//< DISPLACEMENT VECTOR for(int i=0;i<4;++i)y2dops::translate2d(r+2*i,d); };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 4.2 TranslateRectangle2D() Parameters R R specifies a rectangle that has been created using the NewRectangle2D() function. d d specifies a two-element array that stores the displacement vector d (d={ d x, d y }). d determines the magnitude and direction by which R is translated. 4.3 TranslateRectangle2D() Example The following example begins by using the NewRectangle2D() function to create a rectangle that is 2.0 units wide and 1.0 unit long. The rectangle is then translated by 3.0 units in the x direction and 2.5 units in the y direction using the TranslateRectangle2D() function. The coordinates of the corners of the translated rectangle are then printed to the screen. Finally, the memory that was allocated using the NewRectangle2D() function is deallocated using the delete[] command. 4

#include <cstdio>//...printf() #include "y_rectangle_2d.h" int main(){ double* R=yRectangle2D::NewRectangle2D(2,1); double d[2]={3,2.5}; yrectangle2d::translaterectangle2d(r,d); printf(" x, y\n"); for(int i=0;i<4;++i)printf(" %4.1f, %4.1f\n",R[2*i],R[2*i+1]); delete[] R; };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ OUTPUT: x, y 3.0, 2.5 5.0, 2.5 5.0, 3.5 3.0, 3.5 5. Rotating Rectangles the RotateRectangle2D() Function The RotateRectangle2D() function can be used to rotate rectangles about their centers by an angle,, as shown in figure 4. ŷ xˆ Figure 4. A rectangle that has been rotated using the RotateRectangle2D() function. 5

5.1 RotateRectangle2D() Code inline void RotateRectangle2D(//<=========ROTATES A RECTANGLE ABOUT ITS CENTER double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) double rads){//< THE ANGLE OF THE ROTATION (CCW IS POSITIVE) double M[4],o[2]={(R[0]+R[2]+R[4]+R[6])/4,(R[1]+R[3]+R[5]+R[7])/4}; y2dops::rmatrix2d(m,rads); for(int j=0;j<4;++j)y2dops::rotate2d(r+2*j,o,m); };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 5.2 RotateRectangle2D() Parameters R rads R specifies a rectangle that has been created using the NewRectangle2D() function. rads specifies the angle (in radians) of a rotation. The direction of the rotation is counterclockwise. 5.3 RotateRectangle2D() Example The following example begins by using the NewRectangle2D() function to create a rectangle that is 2.0 units wide and 1.0 unit long. The rectangle is then rotated by / 2 using the RotateRectangle2D() function. The coordinates of the corners of the rotated rectangle are then printed to the screen. Finally, the memory that was allocated using the NewRectangle2D() function is deallocated using the delete[] command. #include <cstdio>//...printf() #include "y_rectangle_2d.h" int main(){ double w=2,l=1;//...size of rectangle double* R=yRectangle2D::NewRectangle2D(w,l); yrectangle2d::rotaterectangle2d(r,3.14159265358979/2); printf(" x, y\n"); for(int i=0;i<4;++i)printf(" %4.1f, %4.1f\n",R[2*i],R[2*i+1]); delete[] R; };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ OUTPUT: x, y 1.5, 0.5 1.5, 1.5 0.5, 1.5 0.5, 0.5 6

6. Checking for Rectangle Overlap the RectangleIntersect2D() Function The RectangleIntersect2D() function can be used to determine whether or not any of the sides of two rectangles intersect. Figure 5 shows examples of intersecting and nonintersecting rectangles. ŷ C A B xˆ Figure 5. Intersecting rectangles: A and B intersect, A and C do not. 6.1 RectangleIntersect2D() Code inline bool RectangleIntersect2D(//<===DO THE SIDES OF 2 RECTANGLES INTERSECT? const double R1[8],//< RECTANGLE #1 (CREATE USING NewRectangle2D()) const double R2[8],//< RECTANGLE #2 (CREATE USING NewRectangle2D()) double e=1e 9){//< CUTOFF VALUE FOR DETERMINING IF TWO SIDES ARE PARALLEL for(int j=0;j<4;++j)for(int j2=0;j2<4;++j2){ double t[2],x[2]; double LA[4]={R1[2*j ],R1[2*j +1], R1[(j +1)%4*2],R1[(j +1)%4*2+1]}; double LB[4]={R2[2*j2],R2[2*j2+1], R2[(j2+1)%4*2],R2[(j2+1)%4*2+1]}; if(!y2dops::iparameters2d(t,la,lb))continue; if(y2dops::intersect2d(x,t,la))return true;} return false; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 6.2 RectangleIntersect2D() Parameters R1 R2 e R1 specifies a rectangle that has been created using the NewRectangle2D() function. R2 specifies a second rectangle that has been created using the NewRectangle2D() function. e specifies the cutoff value for determining if two sides are parallel. 7

6.3 RectangleIntersect2D() Return Value The RectangleIntersect2D() function returns true if any side of R1 intersects any side of R2, except for the special case where two sides intersect at more than one point. 6.4 RectangleIntersect2D() Example The following example begins by creating and positioning the three rectangles shown in figure 5. The RectangleIntersect2D() function is then used to determine whether or not the rectangles intersect. The results are printed to the screen. Finally, the memory that was allocated using the NewRectangle2D() function is deallocated using the delete[] command. #include <cstdio>//...printf() #include "y_rectangle_2d.h" int main(){ double* A=yRectangle2D::NewRectangle2D(2,1); double* B=yRectangle2D::NewRectangle2D(2,1); double* C=yRectangle2D::NewRectangle2D(6,3); double d[2]={1,.5}; yrectangle2d::translaterectangle2d(b,d); d[0]=.5,d[1]=.5; yrectangle2d::translaterectangle2d(c,d); printf("a intersects B? %s\n", yrectangle2d::rectangleintersect2d(a,b)?"true":"false"); printf("b intersects C? %s\n", yrectangle2d::rectangleintersect2d(b,c)?"true":"false"); printf("c intersects A? %s\n", yrectangle2d::rectangleintersect2d(c,a)?"true":"false"); delete[] A; delete[] B; delete[] C; };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ OUTPUT: A intersects B? true B intersects C? false C intersects A? false 8

7. Interior/Exterior Check the RectangleInterior2D() Function The RectangleInterior2D() function can be used to determine whether or not a point lies inside a rectangle. ŷ A B P xˆ Figure 6. Interior Points: P is interior to B, but not to A. 7.1 RectangleInterior2D() Code inline bool RectangleInterior2D(//<=============IS A POINT INSIDE A RECTANGLE? const double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) const double P[2]){//< A POINT double A[4]={P[0],P[1],P[0]+R[6] R[0],P[1]+R[7] R[1]}; double B[4]={P[0],P[1],P[0]+R[2] R[0],P[1]+R[3] R[1]}; double C[4]={R[2],R[3],R[4],R[5]}; double D[4]={R[6],R[7],R[4],R[5]}; double t1[2];/*< */y2dops::iparameters2d(t1,a,d); double t2[2];/*< */y2dops::iparameters2d(t2,b,c); return t1[0]>0&&t1[0]<1&&t2[0]>0&&t2[0]<1; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 7.2 RectangleInterior2D() Parameters R R specifies a rectangle that has been created using the NewRectangle2D() function. P P specifies a point that lies in the plane of R. 7.2 RectangleInterior2D() Return Value The RectangleInterior2D() function returns true if P lies interior to R, and false otherwise. 9

7.2 RectangleInterior2D() Example The following example begins by creating and positioning the rectangles and the point that are shown in figure 6. The RectangleInterior2D() function is then used to determine whether or not the point is interior to either of the rectangles. The results are printed to the screen. Finally, the memory that was allocated using the NewRectangle2D() function is deallocated using the delete[] command. #include <cstdio>//...printf() #include "y_rectangle_2d.h" int main(){ double* A=yRectangle2D::NewRectangle2D(2,1); double* B=yRectangle2D::NewRectangle2D(2,1); double d[2]={3,2}; yrectangle2d::translaterectangle2d(b,d); double P[2]={4,2.5}; printf("p interior to A? %s\n", yrectangle2d::rectangleinterior2d(a,p)?"true":"false"); printf("p interior to B? %s\n", yrectangle2d::rectangleinterior2d(b,p)?"true":"false"); delete[] A; delete[] B; };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ OUTPUT: P interior to A? false P interior to B? true 8. Example Placing N Uniformly Distributed Rectangles in a Rectangular Region The following example uses functions from the yrectangle2d namespace to place 800 rectangles that are 2.0 units by 3.0 units in size within a 200.0 unit by 100.0 unit rectangle. Figure 6 provides a visual of the 800 rectangles. Note that none of the rectangles intersect, either with each other, or with the bordering rectangle. The example then creates 1,000,000 randomly positioned points and tests to see if any of the points are interior to any of the rectangles. Figure 7 provides a visual of the points that are interior to rectangles. 10

#include <cstdio>//...file,freopen(),stdout,fclose(),printf() #include <cstdlib>//...rand(),rand_max #include "y_rectangle_2d.h" int main(){ int N=800;//...number of rectangles in region double w=2,l=3;//...size of rectangles double W=200,L=100;//...size of region double* B=yRectangle2D::NewRectangle2D(W,L);//...region border double** R=new double*[n];//...storage for a set of rectangles FILE *f=freopen("rectangles.txt","w",stdout);//...redirect output to a file for(int i=0;i<n;++i){ R[i]=yRectangle2D::NewRectangle2D(w,l); yrectangle2d::rotaterectangle2d(r[i],2*3.14159265358979*rand()/rand_max); redo://...if two rectangles intersect, come back to this point double d[2]={ w/2+w*rand()/rand_max, l/2+l*rand()/rand_max}; yrectangle2d::translaterectangle2d(r[i],d); if(yrectangle2d::rectangleintersect2d(r[i],b)){ d[0]*= 1,d[1]*= 1,yRectangle2D::TranslateRectangle2D(R[i],d); goto redo;} for(int i2=0;i2<i;++i2)if(yrectangle2d::rectangleintersect2d(r[i],r[i2])){ d[0]*= 1,d[1]*= 1,yRectangle2D::TranslateRectangle2D(R[i],d); goto redo;} printf("%f,%f,%f,%f,%f,%f,%f,%f\n",r[i][0],r[i][1],r[i][2],r[i][3], R[i][4],R[i][5],R[i][6],R[i][7]);} fclose(f); freopen("points.txt","w",stdout);//...redirect output to a file for(int k=0;k<1000000;++k){ double P[2]={W*rand()/RAND_MAX,L*rand()/RAND_MAX}; for(int i=0;i<n;++i)if(yrectangle2d::rectangleinterior2d(r[i],p)){ printf("%f,%f\n",p[0],p[1]); break;}} for(int i=0;i<n;++i)delete[] R[i]; fclose(f); };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~DRAFT~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ 11

Figure 7. N uniformly distributed rectangles. Figure 8. Randomly generated points that are interior to 800 uniformly distributed rectangles.. 12

9. Summary A summary sheet is provided at the end of this report. It presents the yrectangle2d namespace, which contains the five functions that are described in this report. Also presented is the y2dops namespace, which is utilized by functions in the yrectangle2d namespace, and the example that is presented in section 8. 13

y_ rectangle_2d.h image created from rectangles.txt (rotated 90 degrees) EXAMPLE 14 #ifndef Y_RECTANGLE_2D_GUARD #define Y_RECTANGLE_2D_GUARD #include "y_2d_ops.h" namespace yrectangle2d{ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ inline double* NewRectangle2D(//<======================CREATES A NEW RECTANGLE double w,//< WIDTH OF RECTANGLE double l){//< LENGTH OF RECTANGLE double *R=new double[8];/*< */R[0]=R[1]=R[3]=R[6]=0,R[2]=R[4]=w,R[5]=R[7]=l; return R; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ inline void TranslateRectangle2D(//<====================TRANSLATES A RECTANGLE double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) const double d[2]){//< DISPLACEMENT VECTOR for(int i=0;i<4;++i)y2dops::translate2d(r+2*i,d); };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ inline void RotateRectangle2D(//<=========ROTATES A RECTANGLE ABOUT ITS CENTER double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) double rads){//< THE ANGLE OF THE ROTATION (CCW IS POSITIVE) double M[4],o[2]={(R[0]+R[2]+R[4]+R[6])/4,(R[1]+R[3]+R[5]+R[7])/4}; y2dops::rmatrix2d(m,rads); for(int j=0;j<4;++j)y2dops::rotate2d(r+2*j,o,m); };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ inline bool RectangleIntersect2D(//<===DO THE SIDES OF 2 RECTANGLES INTERSECT? const double R1[8],//< RECTANGLE #1 (CREATE USING NewRectangle2D()) const double R2[8],//< RECTANGLE #2 (CREATE USING NewRectangle2D()) double e=1e 9){//< CUTOFF VALUE FOR DETERMINING IF TWO SIDES ARE PARALLEL for(int j=0;j<4;++j)for(int j2=0;j2<4;++j2){ double t[2],x[2]; double LA[4]={R1[2*j ],R1[2*j +1], R1[(j +1)%4*2],R1[(j +1)%4*2+1]}; double LB[4]={R2[2*j2],R2[2*j2+1], R2[(j2+1)%4*2],R2[(j2+1)%4*2+1]}; if(!y2dops::iparameters2d(t,la,lb))continue; if(y2dops::intersect2d(x,t,la))return true;} return false; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ inline bool RectangleInterior2D(//<=============IS A POINT INSIDE A RECTANGLE? const double R[8],//< A RECTANGLE (CREATE USING NewRectangle2D()) const double P[2]){//< A POINT double A[4]={P[0],P[1],P[0]+R[6] R[0],P[1]+R[7] R[1]}; double B[4]={P[0],P[1],P[0]+R[2] R[0],P[1]+R[3] R[1]}; double C[4]={R[2],R[3],R[4],R[5]}; double D[4]={R[6],R[7],R[4],R[5]}; double t1[2];/*< */y2dops::iparameters2d(t1,a,d); double t2[2];/*< */y2dops::iparameters2d(t2,b,c); return t1[0]>0&&t1[0]<1&&t2[0]>0&&t2[0]<1; };//~~~YAGENAUT@GMAIL.COM~~~~~~~~~~~~~~~~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~ }//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif image created from points.txt (rotated 90 degrees) #define main yrectangle2drectangularbattlefieldexample//@@@@@@@@@@@@@@@@@@@@@@@@ #include <cstdio>//...file,freopen(),stdout,fclose(),printf() #include <cstdlib>//...rand(),rand_max #include "y_rectangle_2d.h" int main(){ int N=800;//...number of rectangles in region double w=2,l=3;//...size of rectangles double W=200,L=100;//...size of region double* B=yRectangle2D::NewRectangle2D(W,L);//...region border double** R=new double*[n];//...storage for a set of rectangles FILE *f=freopen("rectangles.txt","w",stdout);//...redirect output to a file for(int i=0;i<n;++i){ R[i]=yRectangle2D::NewRectangle2D(w,l); yrectangle2d::rotaterectangle2d(r[i],2*3.14159265358979*rand()/rand_max); redo://...if two rectangles intersect, come back to this point double d[2]={ w/2+w*rand()/rand_max, l/2+l*rand()/rand_max}; yrectangle2d::translaterectangle2d(r[i],d); if(yrectangle2d::rectangleintersect2d(r[i],b)){ d[0]*= 1,d[1]*= 1,yRectangle2D::TranslateRectangle2D(R[i],d); goto redo;} for(int i2=0;i2<i;++i2)if(yrectangle2d::rectangleintersect2d(r[i],r[i2])){ d[0]*= 1,d[1]*= 1,yRectangle2D::TranslateRectangle2D(R[i],d); goto redo;} printf("%f,%f,%f,%f,%f,%f,%f,%f\n",r[i][0],r[i][1],r[i][2],r[i][3], R[i][4],R[i][5],R[i][6],R[i][7]);} fclose(f); freopen("points.txt","w",stdout);//...redirect output to a file for(int k=0;k<1000000;++k){ double P[2]={W*rand()/RAND_MAX,L*rand()/RAND_MAX}; for(int i=0;i<n;++i)if(yrectangle2d::rectangleinterior2d(r[i],p)){ printf("%f,%f\n",p[0],p[1]); break;}} for(int i=0;i<n;++i)delete[] R[i]; fclose(f); };//~~~~~YAGENAUT@GMAIL.COM~~~~~~~~~~DRAFT~~~~~~~~~~LAST~UPDATED~10JUL2013~~~~~~

NO. OF COPIES ORGANIZATION 1 DEFENSE TECHNICAL (PDF) INFORMATION CTR DTIC OCA 1 DIRECTOR (PDF) US ARMY RESEARCH LAB IMAL HRA 1 DIRECTOR (PDF) US ARMY RESEARCH LAB RDRL CIO LL 1 GOVT PRINTG OFC (PDF) A MALHOTRA ABERDEEN PROVING GROUND 1 DIR USARL (PDF) RDRL WML A R YAGER 15

INTENTIONALLY LEFT BLANK. 16