SC - Exploring Analytic Geometry With Mathematica
SC - Exploring Analytic Geometry With Mathematica
with Mathematica
R
LIMITED WARRANTY AND DISCLAIMER OF LIABILITY
ACADEMIC PRESS (“AP”) AND ANYONE ELSE WHO HAS BEEN INVOLVED IN THE CREATION OR
PRODUCTION OF THE ACCOMPANYING CODE (“THE PRODUCT”) CANNOT AND DO NOT WAR-
RANT THE PERFORMANCE OR RESULTS THAT MAY BE OBTAINED BY USING THE PRODUCT.
THE PRODUCT IS SOLD “AS IS” WITHOUT WARRANTY OF ANY KIND (EXCEPT AS HEREAFTER
DESCRIBED), EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY WAR-
RANTY OF PERFORMANCE OR ANY IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE. AP WARRANTS ONLY THAT THE CD-ROM ON WHICH THE
CODE IS RECORDED IS FREE FROM DEFECTS IN MATERIAL AND FAULTY WORKMANSHIP UN-
DER THE NORMAL USE AND SERVICE FOR A PERIOD OF NINETY (90) DAYS FROM THE DATE
THE PRODUCT IS DELIVERED. THE PURCHASER’S SOLE AND EXCLUSIVE REMEDY IN THE
EVENT OF A DEFECT IS EXPRESSLY LIMITED TO EITHER REPLACEMENT OF THE CD-ROM
OR REFUND OF THE PURCHASE PRICE, AT AP’S SOLE DISCRETION.
Any request for replacement of a defective CD-ROM must be postage prepaid and must be accompanied by
the original defective CD-ROM, your mailing address and telephone number, and proof of date of purchase
and purchase price. Send such requests, stating the nature of the problem, to Academic Press Customer
Service, 6277 Sea Harbor Drive, Orlando, FL 32887, 1-800-321-5068. AP shall have no obligation to refund the
purchase price or to replace a CD-ROM based on claims of defects in the nature or operation of the Product.
Some states do not allow limitation on how long an implied warranty lasts, nor exclusions or limitations of
incidental or consequential damages, so the above limitations and exclusions may not apply to you. This
warranty gives you specific legal rights, and you may also have other rights which vary from jurisdiction to
jurisdiction.
THE RE-EXPORT OF UNITED STATES ORIGIN SOFTWARE IS SUBJECT TO UNITED STATES LAWS
UNDER THE EXPORT ADMINISTRATION ACT OF 1969 AS AMENDED. ANY FURTHER SALE OF
THE PRODUCT SHALL BE IN COMPLIANCE WITH THE UNITED STATES DEPARTMENT OF COM-
MERCE ADMINISTRATION REGULATIONS. COMPLIANCE WITH SUCH REGULATIONS IS YOUR
RESPONSIBILITY AND NOT THE RESPONSIBILITY OF AP.
Donald L. Vossler
BME, Kettering University, 1978
MM, Aquinas College, 1981
ACADEMIC PRESS
The study of two-dimensional analytic geometry has gone in and out of fashion several times
over the past century, however this classic field of mathematics has once again become popular
due to the growing power of personal computers and the availability of powerful mathematical
software systems, such as Mathematica, that can provide an interactive environment for study-
ing the field. By combining the power of Mathematica with an analytic geometry software
system called Descarta2D, the author has succeeded in meshing an ancient field of study with
modern computational tools, the result being a simple, yet powerful, approach to studying
analytic geometry. Students, engineers and mathematicians alike who are interested in ana-
lytic geometry can use this book and software for the study, research or just plain enjoyment
of analytic geometry.
Mathematica provides an attractive environment for studying analytic geometry. Mathe-
matica supports both numeric and symbolic computations, meaning that geometry problems
can be solved numerically, producing approximate or exact answers, as well as producing gen-
eral formulas with variables. Mathematica also has good facilities for producing graphical
plots which are useful for visualizing the graphs of two-dimensional geometry.
Features
Exploring Analytic Geometry with Mathematica, Mathematica and Descarta2D provide the
following outstanding features:
• The book can serve as classical analytic geometry textbook with in-line Mathematica
dialogs to illustrate key concepts.
• A large number of examples with solutions and graphics is keyed to the textual devel-
opment of each topic.
• Hints are provided for improving the reader’s use and understanding of Mathematica
and Descarta2D.
• More advanced topics are covered in explorations provided with each chapter, and full
solutions are illustrated using Mathematica.
v
vi Preface
• A detailed reference manual provides complete documentation for Descarta2D, with com-
plete syntax for over 100 new commands.
• The complete book is integrated into the Mathematica Help Browser for easy access and
reading.
Each chapter begins with definitions of underlying mathematical terminology and develops
the topic with more detailed derivations and proofs of important concepts.
Explorations
Each chapter in Exploring Analytic Geometry with Mathematica concludes with more advanced
topics in the form of exploration problems to more fully develop the topics presented in each
chapter. There are more than 100 of these more challenging explorations, and the full solutions
are provided on the CD-ROM as Mathematica notebooks as well as printed in Part VIII of the
book. Sample explorations include some of the more famous theorems from analytic geometry:
Descarta2D
Descarta2D provides a full-scale Mathematica implementation of the concepts developed in
Exploring Analytic Geometry with Mathematica. A reference manual section explains in detail
the usage of over 100 new commands that are provided by Descarta2D for creating, manipulat-
ing and querying geometric objects in Mathematica. To support the study and enhancement
of the Descarta2D algorithms, the complete source code for Descarta2D is provided, both in
printed form in the book and as Mathematica notebook files on the CD-ROM.
CD-ROM
The CD-ROM provides the complete text of the book in Abode Portable Document Format
(PDF) for interactive reading. In addition, the CD-ROM provides the following Mathematica
notebooks:
These notebooks have been thoroughly tested and are compatible with Mathematica Version
3.0.1 and Version 4.0. Maximum benefit of the book and software is gained by using it in
conjunction with Mathematica, but a passive reading and viewing of the book and notebook
files can be accomplished without using Mathematica itself.
I Introduction 1
1 Getting Started 3
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Historical Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 What’s on the CD-ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Mathematica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Starting Descarta2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6 Outline of the Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 Descarta2D Tour 9
2.1 Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Line Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Circles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Arcs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.7 Triangles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.8 Parabolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.9 Ellipses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.10 Hyperbolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.11 Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.12 Area and Arc Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.13 Tangent Curves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.14 Symbolic Proofs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.15 Next Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II Elementary Geometry 25
3 Coordinates and Points 27
3.1 Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2 Rectangular Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ix
x Contents
6 Circles 85
6.1 Definitions and Standard Equation . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2 General Equation of a Circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.3 Circle from Diameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.4 Circle Through Three Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.5 Intersection of a Line and a Circle . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.6 Intersection of Two Circles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.7 Distance from a Point to a Circle . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.8 Coaxial Circles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.9 Radical Axis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.10 Parametric Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Contents xi
7 Arcs 105
7.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.2 Bulge Factor Arc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.3 Three–Point Arc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.4 Parametric Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.5 Points and Angles at Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.6 Arcs from Ray Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.7 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8 Triangles 117
8.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.2 Centroid of a Triangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
8.3 Circumscribed Circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
8.4 Inscribed Circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
8.5 Solving Triangles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
8.6 Cevian Lengths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
8.7 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
10 Ellipses 145
10.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
10.2 General Equation of an Ellipse . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
10.3 Standard Forms of an Ellipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
10.4 Reduction to Standard Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
10.5 Ellipse from Vertices and Eccentricity . . . . . . . . . . . . . . . . . . . . . . . 151
10.6 Ellipse from Foci and Eccentricity . . . . . . . . . . . . . . . . . . . . . . . . . 153
10.7 Ellipse from Focus and Directrix . . . . . . . . . . . . . . . . . . . . . . . . . . 153
10.8 Parametric Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.9 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
xii Contents
11 Hyperbolas 159
11.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
11.2 General Equation of a Hyperbola . . . . . . . . . . . . . . . . . . . . . . . . . . 161
11.3 Standard Forms of a Hyperbola . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
11.4 Reduction to Standard Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
11.5 Hyperbola from Vertices and Eccentricity . . . . . . . . . . . . . . . . . . . . . 167
11.6 Hyperbola from Foci and Eccentricity . . . . . . . . . . . . . . . . . . . . . . . 168
11.7 Hyperbola from Focus and Directrix . . . . . . . . . . . . . . . . . . . . . . . . 169
11.8 Parametric Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
11.9 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
17 Area 237
17.1 Areas of Geometric Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
17.2 Curved Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
17.3 Circular Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
17.4 Elliptic Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
17.5 Hyperbolic Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
17.6 Parabolic Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
17.7 Conic Arc Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
17.8 Summary of Area Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
17.9 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
21 Biarcs 311
21.1 Biarc Carrier Circles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
21.2 Knot Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
21.3 Knot Circles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
21.4 Biarc Programming Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
21.5 Explorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
VI Reference 323
22 Technical Notes 325
22.1 Computation Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
22.2 Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
22.3 Descarta2D Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
22.4 Descarta2D Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
22.5 Descarta2D Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
22.6 Descarta2D Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
D2DHyperbola2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
D2DIntersect2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
D2DLine2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
D2DLoci2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
D2DMaster2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
D2DMedial2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
D2DNumbers2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
D2DParabola2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
D2DPencil2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
D2DPoint2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
D2DQuadratic2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
D2DSegment2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
D2DSketch2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
D2DSolve2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
D2DTangentCircles2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
D2DTangentConics2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
D2DTangentLines2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
D2DTangentPoints2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
D2DTransform2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
D2DTriangle2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
IX Epilogue 837
Installation Instructions 839
Bibliography 843
Index 845
Part I
Introduction
Chapter 1
Getting Started
1.1 Introduction
The purpose of this book is to provide a broad introduction to analytic geometry using the
Mathematica and Descarta2D computer programs to enhance the numerical, symbolic and
graphical nature of the subject. The book has the following objectives:
• To provide a geometric research tool that can be used to explore numerically and sym-
bolically various theorems and relationships of two-dimensional analytic geometry. Due
to the nature of the Mathematica environment in which Descarta2D was written, the
system can be easily enhanced and extended.
• To provide a reference of geometric formulas from analytic geometry that are not gener-
ally provided in more broad-based mathematical textbooks, nor included in mathemat-
ical handbooks.
3
4 Chapter 1 Getting Started
CD
readme . txt
continued to resort to the conventional methods of geometric reasoning as set forth in great
detail by Euclid and his school some 2000 years before. The tremendous advances made in
the study of geometry since the time of Descartes are largely due to his introduction of the
coordinate system and the associated algebraic or analytic methods.
With the advent of powerful mathematical computer software, such as Mathematica, much
of the tedious algebraic manipulation has been removed from the study of analytic geometry,
allowing comfortable exploration of the subject even by amateur mathematicians. Mathe-
matica provides a programmable environment, meaning that the user can extend and expand
the capabilities of the system including the addition of completely new concepts not covered
by the kernel Mathematica system. This notion of expandability serves as the basis for the
implementation of the Descarta2D system, which is essentially an extension of the capabilities
of Mathematica cast into the world of analytic geometry.
Descarta2D
warranty. txt
* . m, init . m - Descarta2D files
Documentation
English
BrowserCategories. m
Table_of_Contents. nb
Chapters - * . nb
Explorations - * . nb files
Packages - * . nb files
All of the software packages and explorations in this book were developed on a Pentium
Pro computer system using version 4.0 of the Windows NT operating system and Mathematica
version 3.0.1. Due to the portability of Mathematica, the software should operate identically
on other computer systems, including other Intel-based personal computers, Macintoshes and
a wide range of Unix workstations. The Adobe pdf files on the CD are also portable and
should be readable on a variety of operating systems.
1.4 Mathematica
In this book an assumption is made that you have at least a rudimentary understanding of
how to run the Mathematica program, how to enter commands and receive results, and how to
arrange files on a computer disk so that programs can locate them. A sufficient introduction
to Mathematica would be gained by reading the “Tour of Mathematica” in Stephen Wolfram’s
book Mathematica: A System for Doing Mathematics by Computer.
The syntax Mathematica uses for mathematical operations differs somewhat from tradi-
tional mathematical notation. Since Descarta2D is implemented in the Mathematica pro-
gramming language it follows all the syntactic conventions of the Mathematica system. See
Wolfram’s Mathematica book for more detailed descriptions of the syntax. Once you become
familiar with Mathematica you will begin to appreciate the consistency and predictability of
the system.
6 Chapter 1 Getting Started
If this is the first command in the Mathematica session, the Mathematica kernel will be loaded
first, and then the declarations will be loaded. Depending on the speed of your computer this
may take a few seconds or several minutes. After the initial start-up, packages will load at
automatically as new Descarta2D functions are used for the first time. When a package is first
loaded, you may notice a delay in computing results; after the package is loaded, results are
computed immediately and the time taken depends on the complexity of the computation.
The examples in this book that illustrate the usage of Descarta2D were chosen primarily for
their simplicity, rather than to correspond to significant calculations in analytic geometry. At
the end of each chapter a section entitled “Explorations” provides more realistic applications
of Descarta2D. All of the examples in this book were generated by running an actual copy of
Mathematica version 3.0.1. The interactive dialogs of each Mathematica session are provided
in the corresponding chapter notebook on the CD, so very little typing is required to replicate
the output and plots in each chapter. If you choose to enter the commands yourself instead
of using the notebook on the CD, you should enter the commands exactly as they are printed
(including all spaces and line breaks). This will insure that you obtain the same results as
printed in the text. Once you become more familiar with Mathematica and Descarta2D, you
will learn what deviations from the printed text are acceptable.
Example. Plot these objects using the Sketch2D command: Point2D[{-1, 2}],
Line2D[2, -3, 1] and Circle2D[{1, 0}, 2]. (The meaning of these geometric ob-
jects will be explained in subsequent chapters; for now it is sufficient to understand
that we are plotting a point, a line and a circle.)
3
2
1
0
-1
-2
-4 -2 0 2 4
Generally, the chapters comprising Parts I through V present material in sections with
simple examples. The examples are sometimes supplemented with Descarta2D and Mathe-
matica Hints that illustrate the more subtle usages of the commands. Each chapter ends with
an “Explorations” section containing several more challenging problems in analytic geometry.
The solutions for the explorations are provided as Mathematica notebooks on the CD, as well
as being listed alphabetically in Part VIII.
Parts VI and VII serve as a reference manual for the Descarta2D system. The reference
manual includes a description of the geometric objects provided by Descarta2D, a browser
for quickly finding command syntax and options, and a listing of the error messages that
may be generated. Part VII provides a complete listing, with comments, of all the packages
comprising Descarta2D.
Part VIII of the book contains reproductions of the notebooks which provide the solutions
to the explorations found at the end of each chapter. The notebooks are listed in alphabetical
order by their file names. The exploration notebook files may also be reviewed directly off the
CD using Mathematica or MathReader.
Part IX contains the instructions for installing Descarta2D on your computer system as
well as a Bibliography and a detailed index.
Chapter 2
Descarta2D Tour
The purpose of this chapter is to provide a tour consisting of examples to show a few of the
things Descarta2D can do. Concepts introduced informally in this chapter will be studied
in detail in subsequent chapters. The tour is not intended to be a complete overview of
Descarta2D, but just a sampling of a few of the capabilities provided by Descarta2D.
2.1 Points
The simplest geometric object is a point in the plane. The location of a point is specified
by a pair of numbers called the x- and y-coordinates of the point and is written as (x, y).
In Mathematica and Descarta2D point coordinates are enclosed in curly braces as {x, y}. In
Descarta2D a point with coordinates (x, y) is represented as Point2D[{x, y}]. The following
commands are used to plot the points (1, 2), (3, −4) and (−2, 3):
3
2
1
0
-1
-2
-3
-4
-2 -1 0 1 2 3
9
10 Chapter 2 Descarta2D Tour
assign the names p1, p2 and p3 to the points sketched previously. After a name is assigned,
we can refer to the object by using its name.
Descarta2D provides numerous commands for constructing points. These commands have
the name Point2D followed by a sequence of arguments, separated by commas and enclosed
in square brackets. For example, the command
1 1
Out[4] Point2DA9− , − =E
2 2
constructs a point, named p3, that is the midpoint of two other points named p1 and p2.
2.2 Equations
The underlying principle of analytic geometry is to link algebra to the study of geometry.
There are two fundamental problems studied in analytic geometry: (1) given the equation
of a curve determine its shape, location and other geometric characteristics; and (2) given a
description of the plot of a curve (its locus) determine the equation of the curve. Equations
are represented in Mathematica and Descarta2D in a manner that is very similar to standard
algebra. For example, the linear equation 2x + 3y − 4 = 0 is entered using the following
command:
In[5]: Clear@x, yD;
2 ∗ x + 3 ∗ y − 4 == 0
Out[5] −4 + 2 x + 3 y == 0
Ÿ Mathematica Hint. Mathematica uses the double equals sign, ==, to represent
the equality in an equation; the single equals sign, =, as has already been shown,
is used to assign names. Also, notice that Mathematica sorts all output into a
standard order that may be different than the order you typed.
The left side of the equation above is called a linear polynomial in two unknowns. The general
form of a linear polynomial in two unknowns is given by
Ax + By + C.
2.2 Equations 11
Since linear polynomials occur frequently in the study of analytic geometry, Descarta2D pro-
vides a special format for linear polynomials which is of the form Line2D[A, B, C] where A
is the coefficient of the x term, B the coefficient of the y term and C is the constant term.
Descarta2D also provides functions for converting between linear polynomials and Line2D
objects.
In[6]: Clear@x, yD;
l1 = Line2D@2, 3, −4D;
poly1 = 2 ∗ x + 3 ∗ y − 4;
Out[7] −4 + 2 x + 3 y
Frequently we will also be interested in quadratic equations which represent such curves as
circles, ellipses, hyperbolas and parabolas. The algebraic form of a quadratic equation is
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0.
Descarta2D provides a special form for representing a quadratic polynomial which is
Quadratic2D[A, B, C, D, E, F]
and functions for converting between polynomials and Quadratic2D objects.
In[9]: Clear@x, yD;
poly1 = 2 ∗ x ^ 2 + 3 ∗ x ∗ y + 3 ∗ y ^ 2 − 4 ∗ x − 5 ∗ y − 3;
q1 = Quadratic2D@2, 3, 3, −4, −5, −3D;
Out[10] −3 − 4 x + 2 x2 − 5 y + 3 x y + 3 y2
Equations are often constructed so that they may be solved for numbers that make the
equality true. For example, the quadratic equation in one unknown, x2 − 7x + 10 = 0 is solved
when x = 2 or x = 5. Mathematica provides powerful functions for solving equations. For
example, the Solve command can be used to find the solutions to the equation given above.
In[12]: Clear@xD;
Solve@x ^ 2 − 7 ∗ x + 10 == 0, xD
The Solve command returns solutions in the form of Mathematica rules which are useful in
subsequent computations. We will often need to solve equations in order find the solutions to
geometric problems.
12 Chapter 2 Descarta2D Tour
2.3 Lines
Intuitively, a straight line is a curve we might draw with a straightedge ruler. In mathematics,
a line is considered to be infinite in length extending in both directions. We often think of a
line as the shortest path connecting two points, and, in fact, this is one of the many methods
provided by Descarta2D for constructing a line. Mathematically, a line is represented as a
linear equation of the form
Ax + By + C = 0
where A, B and C are called the coefficients of the line and determine its position and direction.
For example, in Descarta2D the line x − 2y + 4 = 0 is represented as Line2D[1, -2, 4]. The
following command constructs a line from two points.
In[13]: l1 = Line2D@p1 = Point2D@8−3, −1<D, p2 = Point2D@83, 2<DD
This is the line −3x + 6y − 3 = 0. We can plot the points and the line to get graphical
verification that the line passes through the two points.
2
1
0
-1
-4 -2 0 2 4
We might be interested in the angle a line makes measured from the horizontal. The angle
can be determined using
In[15]: a1 = Angle2D@l1D êê N;
a2 = a1 ê Degree;
8a1, a2<
which indicates that the line makes an angle of approximately 0.463648 radians, or about
26.5651 degrees, measured from the horizontal.
We may want to construct lines with certain relationships to another line. For example,
the following commands construct lines parallel and perpendicular to a given line through a
given point.
In[16]: p1 = Point2D@82, 1<D;
l1 = Line2D@3, 1, −2D;
8l2 = Line2D@p1, l1, Parallel2DD,
l3 = Line2D@p1, l1, Perpendicular2DD<
-2
-4
-6
-4 -2 0 2 4
1
0.5
0
-0.5
-1
-1.5
-2
-2 -1 0 1 2 3
14 Chapter 2 Descarta2D Tour
We might want to determine the midpoint of a line segment, and we could use the
Point2D[point, point] function to do so, but Descarta2D provides a more convenient func-
tion for directly constructing the midpoint of a line segment.
In[19]: p1 = Point2D@l1D
1 1
Out[19] Point2DA9 , − =E
2 2
1
0.5
0
-0.5
-1
-1.5
-2
-2 -1 0 1 2 3
2.5 Circles
A circle’s position is determined by its center point and its size is specified by its radius. The
standard equation of a circle is
(x − h)2 + (y − k)2 = r2
where (h, k) are the coordinates of the center point, and r is the radius of the circle. In
Descarta2D a circle is represented as Circle2D[{h, k}, r].
In[21]: c1 = Circle2D@81, 2<, 2D;
Sketch2D@8c1, Point2D@c1D<D;
0
-1 0 1 2 3
2.6 Arcs 15
As demonstrated by the example, the function Point2D[circle] constructs the center point of
the circle. The function Radius2D[circle] returns the radius of a circle.
In[22]: Radius2D@c1D
Out[22] 2
Descarta2D provides many functions for constructing circles. For example, we can construct
a circle that passes through three given points.
1 17
Out[23] Circle2DA90, =, E
8 8
-1
-2
-2 -1 0 1 2
2.6 Arcs
Just as a line segment is a portion of a line, an arc is a portion of a circle. We can specify
the span of the arc in terms of the angles the arc’s sector sides make with the horizontal. In
Descarta2D an arc can be constructed using Arc2D[point, r, {θ1 , θ2 }] (this is not the standard
representation of an arc, it is merely one of the ways Descarta2D provides for constructing an
arc).
4
3.5
3
2.5
2
1.5
1
0 1 2 3 4
As with a circle, we can construct an arc in many ways. For example, we can construct an
arc passing through three points.
2
1.5
1
0.5
0
-0.5
-1
-2 -1 0 1 2
2.7 Triangles
Triangles are defined by three line segments connecting three points called the vertices of the
triangle. In Descarta2D a triangle is represented as
8
7
6
5
4
3
2
1
1 2 3 4 5 6 7 8
We can inscribe a circle inside a triangle, as well as circumscribe one about a triangle. We
can also compute properties such as its center of gravity.
2 4 6 8
2.8 Parabolas
A parabola is the cross-sectional shape required for a reflective mirror to focus light to a
single point. The standard equation of a parabola centered at (0, 0) and opening to the right
is y 2 = 4f x, where f is the focal length, the distance from the vertex point to the focus. We
can apply a rotation, θ, to the parabola to produce a parabola of the same shape, but opening
in a different direction. In Descarta2D the expression Parabola2D[{h, k}, f, θ] is used to
represent a parabola.
18 Chapter 2 Descarta2D Tour
4
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
2.9 Ellipses
An ellipse is a shape of the path a planet makes as it orbits the sun. The standard equation
for an ellipse is given by
x2 y2
2
+ 2 =1
a b
where 2a is the length of the longer major axis, and 2b is the length of the minor axis. Ellipses
in other positions and orientations may be obtained by moving the center point or by rotating
the ellipse. In Descarta2D the expression Ellipse2D[{h, k}, a, b, θ] is used to represent an
ellipse.
In[32]: e1 = Ellipse2D@80, 0<, 2, 1, 0D;
e2 = Ellipse2D@82, 1<, 3, 2, Pi ê 4D;
Sketch2D@8e1, e2<D;
3
2
1
0
-1
-2 -1 0 1 2 3 4
5 5 5 5
Out[33] 9Point2DA92 + $%%%%%
% , 1 + $%%%%%
% =E, Point2DA92 − $%%%%%
% , 1 − $%%%%%
% =E=
2 2 2 2
2.10 Hyperbolas 19
-1
0 1 2 3 4
2.10 Hyperbolas
A hyperbola in standard position has an equation similar to an ellipse that is given by
x2 y2
2
− 2 = 1.
a b
As with the ellipse, the constants a and b represent the lengths of certain axes of the hyperbola.
The hyperbola plot consists of two separate pieces, called branches, both extending to infinity
in opposite directions. The lines bounding the extent of the hyperbola are called asymptotes.
A second hyperbola, closely related to the first, is bounded by the same asymptotes and
is called the conjugate hyperbola. Hyperbolas can also be rotated in the plane and moved
by adjusting their center points. The expression Hyperbola2D[{h, k}, a, b, θ] is used to
represent a hyperbola in Descarta2D.
2
1
0
-1
-2
-4 -2 0 2 4
20 Chapter 2 Descarta2D Tour
3 2
2
1 1
0 0
-1 -1
-2 -2
-3-6 -4 -2 0 2 4 6 -4 -2 0 2 4
2.11 Transformations
We can change the position, size and orientation of an object by applying a transformation
to the object. Common transformations include translating, rotating, scaling and reflecting.
A Descarta2D object can be transformed to produce a new object.
3
2
1
0
-1
-2
-4 -2 0 2 4
Out[37] 84 π, 4 π<
2
1
0
-1
-2
-4 -2 0 2 4
This example produces the four lines tangent to two given circles.
In[39]: c1 = Circle2D@82, 0<, 1D;
c2 = Circle2D@8−3, 0<, 2D;
t1 = TangentLines2D@c1, c2D;
Sketch2D@8c1, c2, t1<D;
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
Conic curves (ellipses, parabolas and hyperbolas) can also be constructed passing through
points or tangent to lines. The following example constructs four ellipses that are tangent to
three lines and pass through two points.
In[40]: l1 = Line2D@1, 0, −1D;
l2 = Line2D@0, 1, −1D;
l3 = Line2D@810, 0<, 80, 6<D;
p1 = Point2D@82, 3<D;
p2 = Point2D@84, 2<D;
t1 = TangentConics2D@8l1, l2, l3, p1, p2<D êê N;
22 Chapter 2 Descarta2D Tour
y
P3 Ha, bL
P2 Hd, 0L
P1 H0, 0L x
6
5
4
3
2
1
0
2 4 6 8 10
Without loss of generality, we pick a convenient position for the triangle in the plane as shown
in Figure 2.1. One vertex is located at the origin, the second on the +x-axis and the third is
arbitrarily placed.
2.15 Next Steps 23
The perpendicular bisectors of the sides of the triangle pass through the midpoint of each side
and are perpendicular to the side. Each of these lines is constructed using the Descarta2D
command Line2D[point, point, Perpendicular2D].
In[43]: L12 = Line2D@P1, P2, Perpendicular2DD;
L13 = Line2D@P1, P3, Perpendicular2DD;
L23 = Line2D@P2, P3, Perpendicular2DD;
d a2 + b2 − a d d a2 + b2 − a d
Out[44] 9Point2DA9 , =E, Point2DA9 , =E=
2 2b 2 2b
By inspection, the coordinates of these two points are identical, which proves the first part
of the theorem. To prove the second part of the theorem we determine the distance from the
intersection point to each of the vertex points and show that the distance is the same for all
three vertex points.
In[45]: 8d1, d2, d3< = Map@Distance2D@#, P4D&, 8P1, P2, P3<D;
8d1 − d2, d2 − d3, d1 − d3< êê FullSimplify
Many of the explorations provided at the end of upcoming chapters were developed using
techniques similar to the one outlined above. Using Mathematica and Descarta2D to prove
general assertions in analytic geometry illustrates the power of these computer programs.
Elementary Geometry
Chapter 3
3.1 Numbers
Integers are the whole numbers used for counting, both negative and positive, as well as zero.
Ratios of integers such as 1/2, 5/7, 4/1 and 23/15 are called rational numbers. Numbers that
can be plotted √ as distances from a fixed point on a line are called real numbers. Examples are
−8, 0, 2.1387, 2, 5/3 and π. √
If a and b represent real numbers and i = −1, the expression a + bi is a complex number.
A complex number is the sum of a real number a and a pure imaginary number bi. The two
complex numbers a + bi and a − bi are called conjugate complex numbers.
In general, this book deals with real numbers, but since we are using algebraic techniques to
study geometry, complex numbers naturally arise in the formulations. Mathematica provides
a variety of ways to represent numbers as summarized in Table 3.1.
27
28 Chapter 3 Coordinates and Points
Any given number, integer, rational, real or complex, is a constant. Mathematica provides
symbols for some common numbers that are fixed value constants as shown in Table 3.2.
Sometimes we do not wish to specify what the particular constant is and indicate a general
constant by any one of the letters a, b, c, . . ., A, B, C, . . ., and such constants are referred to
as parameters.
II I
-x O x
III IV
-y
y
AH3, 2L
P1 Hx1 , y1 L
x
BH-2, -1L
one and only one point and, conversely, to each point in the plane there corresponds one and
only one pair of numbers.
Example. Plot the points with the following coordinates: (−2, 3), (4, 2) and
(−4, −1).
3
2
1
0
-1
-4 -2 0 2 4
The curly brackets surrounding the point’s coordinates are optional and may be
omitted. Descarta2D will automatically add the curly brackets when the point’s
abscissa and ordinate are given as two arguments, Point2D[x, y], as shown below.
A symbolic name may be assigned to a point, and this name can be used later to
refer to the point.
In[2]: p1 = Point2D@−2, 3D
In[3]: p1
y
P2 Hx2 , y2 L
d
y2 - y1
P1 Hx1 , y1 L
x2 - x1 Q
segment. On the other hand, if the direction from A to B points to the left, we say that AB
is a negative segment. Then we can assign to the segment AB a positive or negative number
indicating the direction and number of units of the
segment.
This signed number is indicated
by AB. The absolute value of AB, indicated by AB , is a positive number called the length
of the line segment. When the context is clear the symbol AB may be used to represent the
line containing the points A and B, the line segment AB, or the length of the segment, |AB|.
To calculate the number (positive or negative) of x-units in the segment AB, let x2 be the
abscissa of B and let x1 be the abscissa of A. Then, if B is to the right of A, the number of
x-units in the segment AB is equal to x2 − x1 . We define BA to be the negative of segment
AB. Thus
AB = x2 − x1 and BA = x1 − x2 .
In the same fashion we can define a directed segment CD on, or parallel to, the y-axis, to
be positive or negative depending on whether the arrow from C to D points up (positive
direction) or down (negative direction). Thus
CD = y2 − y1 and DC = y1 − y2 .
Let P1 (x1 , y1 ) and P2 (x2 , y2 ) be two points lying in the first quadrant and draw line
segments P1 Q and P2 Q parallel to the coordinate axes as shown in Figure 3.3. By subtracting
the abscissas, P1 Q = x2 − x1 ; similarly subtracting ordinates, P2 Q = y2 − y1 . Making use of
the Pythagorean Theorem on the right triangle P1 QP2 , we have
The same formula holds true regardless of the quadrants in which the points lie and regardless
of the order in which the points are taken.
32 Chapter 3 Coordinates and Points
Example. Find the distance between the two points (3, −1) and (−4, −2).
The coordinates of the points may be symbolic and the points themselves may be
named points.
"##########################################
#
Out[5] Hx1 − x2L2 + Hy1 − y2L2
Ÿ example
Mathematica Hint. The Mathematica function Clear is used in the previous
and throughout other examples in this book to insure that variable
names used in the examples are not set to some unintended value from a previous
computation.
Descarta2D Hint. There are several Descarta2D functions that are handy for
working with points and coordinates. Coordinates2D[point] returns the (x, y)
coordinates of a point as the list {x, y}. The functions XCoordinate2D[point]
and XCoordinate2D[coord] give the x-coordinate, and YCoordinate2D[point]
and YCoordinate2D[coord] give the y-coordinate.
3.4 Midpoint between Two Points 33
y
P2 Hx2 , y2 L
P12
P1 Hx1 , y1 L
Example. Find the midpoint between the points (−2, 1) and (3, −2).
Solution. The function Point2D[point, point] returns the midpoint of the two
points. Alternatively, the function Point2D[lnseg] returns the midpoint of a line
segment.
In[6]: p1 = Point2D@8−2, 1<D;
p2 = Point2D@83, −2<D;
p12 = Point2D@p1, p2D
1 1
Out[6] Point2DA9 , − =E
2 2
y P2 Hx2 , y2 L
r2
PHx, yL
S
r1
P1 Hx1 , y1 L
Q R
x - x1 x2 - x
coordinates (x, y) which are to be determined. Sense is important here and P must be located
so that P1 P/P P2 = r1 /r2 .
Since 4P1 P Q and 4P SP2 are similar, it follows that (x − x1 )/r1 = (x2 − x)/r2 . Solving
this equation for x yields
x1 r2 + x2 r1
x= . (3.1)
r1 + r2
Similarly,
y1 r2 + y2 r1
y= . (3.2)
r1 + r2
To find the midpoint of the segment P1 P2 the ratio r1 /r2 must be unity; hence r1 = r2
and Equations (3.1) and (3.2) specialize to
x1 + x2 y1 + y2
x= and y = . (3.3)
2 2
Equations (3.1), (3.2) and (3.3) also have useful physical interpretations. In (3.1) and (3.2),
let x and y be the coordinates of the center of gravity of masses r1 and r2 placed at P1 and
P2 , respectively. If the masses are equal, the center of gravity lies halfway between them as
indicated by (3.3).
It is of further interest to note the positions of P for various values of the ratio r1 /r2 . If
this ratio is zero, then P coincides with P1 , and if this ratio is a positive number, P is an
internal point of division. As r1 /r2 → +∞, P → P1 . For −∞ < r1 /r2 < −1, P is an external
point of division (in the direction of P1 P2 ). For −1 < r1 /r2 < 0, P is an external point in the
opposite direction with P1 P negative and P2 P positive.
Example. Find the point that divides the line segment between the points
P1 (−2, 5) and P2 (4, −1) into the ratio r1 /r2 = −2.
3.5 Point of Division of Two Points 35
D12
P2 Hx2 , y2 L
d PHx, yL
P1 Hx1 , y1 L
x
Notice that it is invalid for r1 + r2 to equal zero in Equations (3.1) and (3.2) as this would
tend to generate a point at infinity.
where d is the (possibly negative) offset distance and D12 is the distance between the two
points.
36 Chapter 3 Coordinates and Points
Example. Find the point offset a distance 2 from the point (3, 1) towards the
point (−2, 4).
2 2
Out[9] Point2DA93 − 5 $%%%%%%%
% , 1 + 3 $%%%%%%%
% =E
17 17
Mathematica provides the Det command for expanding the value of such a determinant.
Out[10] 0
We see from Mathematica that for any value of d, the determinant given is zero. Therefore,
the necessary and sufficient condition that three points lie on the same line is given by the
determinant equation
x1 y1 1
x2 y2 1 = 0,
x3 y3 1
where the coordinates of the points are P1 (x1 , y1 ), P2 (x2 , y2 ) and P3 (x3 , y3 ).
3.7 Explorations 37
Example. Show that the three points (1, 2), (7, 6) and (4, 4) are collinear.
Out[11] 0
Descarta2D provides a specific function for determining whether three points are
collinear: IsCollinear2D[point, point, point] returns True if the points are col-
linear; otherwise, it returns False.
In[12]: IsCollinear2D@Point2D@81, 2<D, Point2D@87, 6<D, Point2D@84, 4<DD
Out[12] True
8
6
4
2
0
0 2 4 6 8
3.7 Explorations
Collinear Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ptscol.nb
Show that the three points (3a, 0), (0, 3b) and (a, 2b) are collinear.
—–
38 Chapter 3 Coordinates and Points
—–
Non-uniqueness of Polar Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarunq.nb
Show that the polar coordinates of a point (r, θ) are not unique as all points of the form
(r, θ + 2kπ) and (−r, θ + (2k + 1)π)
represent the same position in the plane for integer values of k.
—–
Stewart’s Theorem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . stewart.nb
b a
d
A B
m D n
AB = c
Show that for any 4ABC as shown in the figure above the relationship between the lengths
of the labeled line segments is given by
a2 m + b2 n = c(d2 + mn).
—–
Collinear Polar Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarcol.nb
Show that the points P1 (r1 , θ1 ), P2 (r2 , θ2 ) and P3 (r3 , θ3 ) in polar coordinates are collinear
if and only if
−r1 r2 sin(θ1 − θ2 ) + r1 r3 sin(θ1 − θ3 ) − r2 r3 sin(θ2 − θ3 ) = 0.
—–
Hypotenuse Midpoint Distance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tridist.nb
Prove that the midpoint of the hypotenuse of a right triangle is equidistant from the vertices.
—–
Chapter 4
Using algebraic techniques to solve geometry problems is the difference in approach between
analytic geometry and planar geometry. Use of such techniques links the algebraic concept of
an equation to the graphical representation of geometry shown in a graph or plot. This chapter
introduces some of the simple algebraic techniques for solving equations that are heavily used
in analytic geometry.
4.2 Polynomials
A mathematical expression consisting of a sum of various positive integer powers of a variable
is called a polynomial. The largest exponent that appears in a polynomial is called the degree
of the polynomial. Polynomials of low-degree have special names as shown in Table 4.1.
Polynomials can involve more than one variable. For example the polynomial x + 2y + 3 is
a linear polynomial in two unknowns and x2 + 3xy + 2y 2 − 2x + 4 is a quadratic polynomial in
39
40 Chapter 4 Equations and Graphs
two unknowns. Descarta2D provides special objects, called equation objects, for representing
linear and quadratic polynomials in two unknowns (see Table 4.2).
Solution. Line2D[poly, {x, y}] and Quadratic2D[poly, {x, y}] convert linear
and quadratic polynomials into equivalent Line2D and Quadratic2D objects. The
functions Polynomial2D[line, {x, y}] and Polynomial2D[quad, {x, y}] convert
Line2D and Quadratic2D objects, respectively, into polynomials.
In[1]: Clear@x, yD;
8l1 = Line2D@4 ∗ x − 2 ∗ y + 1, 8x, y<D,
q1 = Quadratic2D@x ^ 2 − 3 ∗ x ∗ y + 3 ∗ x − 2 ∗ y + 4, 8x, y<D<
Out[2] 81 + 4 x − 2 y, 4 + 3 x + x2 − 2 y − 3 x y<
1
, ,,, 2 3 I@@@@ 4
,
, @ @R
ax + by + c ax + by + c == 0
ax2 + bxy + cy 2 + dx + ey + f ax2 + bxy + cy 2 + dx + ey + f == 0
Polynomials Equations
4.3 Equations
If a function of a single variable, f (x), is set equal to zero, the relation f (x) = 0 is called an
equation. This equation imposes a condition on the variable x which then can assume only
certain values. For example, if Ax + B = 0, then x can take on only one value, x = −B/A. If
the equation is sin x = 0, x can assume an unlimited number of values of the form kπ, where k
is any integer. The process of finding the values of x that satisfy the equation is called solving
the equation. The values of x which satisfy f (x) = 0 are called the solutions or roots of the
equation. All of the real solutions of f (x) = 0 may be represented by points on a line such as
the x-axis. These points constitute the graph of the equation in one dimension.
If a function of two variables, f (x, y), is set equal to zero the relation f (x, y) = 0 is also
an equation. But this equation permits one of the variables to be independent, while the
other is dependent and a function of the first. For example, f (x, y) = 0 might be solved for
y in terms of x, yielding y = g1 (x), indicating that x is the independent variable and y the
dependent variable. Or f (x, y) = 0 might be solved for x yielding x = g2 (y) interchanging the
independent and dependent variables.
In addition to representing polynomials, the Line2D and Quadratic2D objects may also
be used to represent equations (the implicit assumption is that they represent polynomials
set equal to zero). Figure 4.1 shows the relationships between polynomials, equations and
Descarta2D equation objects. Table 4.3 summarizes the Descarta2D functions that accomplish
the conversions labeled 1 to 4 in Figure 4.1.
Example. Convert the Descarta2D linear equation object Line2D[2, 3, -1] into
an equivalent Mathematica equation. Similarly, convert the Descarta2D quadratric
object Quadratic2D[1, -2, 2, 3, -3, 7] into a Mathematica equation.
The expression under the radical, D ≡ b2 − 4ac, is called the discriminant of the equation and
determines the type of solutions admitted by the equation. Assuming the coefficients are real
numbers, D > 0 indicates that the equation has two real and distinct solutions; if D = 0 the
equation has two real solutions that are equal; and if D < 0 the equation has two complex
solutions that are conjugates of each other.
In[5]: Clear@xD;
Solve@3 x ^ 2 − 4 x − 5 == 0, xD
1 è!!!!! 1 è!!!!!
Out[5] 99x → I2 − 19 M=, 9x → I2 + 19 M==
3 3
44 Chapter 4 Equations and Graphs
a1 x + b1 y + c1 = 0 and a2 x + b2 y + c2 = 0.
Simple algebra yields the formulas for x and y that solve the two equations:
b 1 c2 − b 2 c1 a 2 c1 − a 1 c2
x= and y = .
a1 b 2 − a2 b 1 a1 b 2 − a2 b 1
If the denominator, a1 b2 − a2 b1 , is equal to zero the equations have no solution and are called
inconsistent.
a1 x + b1 y + c1 = 0 and
a2 x2 + b2 xy + c2 y 2 + d2 x + e2 y + f2 = 0.
In the general case the system of these two equations can be solved by first solving the
linear equation for one of the variables, say x, in terms of the other, y. The expression for
x is then substituted into the quadratic equation, yielding a somewhat more complicated
quadratic equation in y alone. The quadratic equation in one variable is then solved yielding
two values for y which may then be substituted back into the linear equation to determine
the corresponding values of x. While this solution technique is straightforward, it produces
somewhat complicated expressions for x and y, and special cases must be handled individually
(for example, if the linear equation has no y term, then the procedure must be altered to solve
for x instead).
4.4 Solving Equations 45
1 è!!!!!!!! 1 è!!!!!!!!
Out[7] 99x → I−69 − 4 295 M, y → I62 + 3 295 M=,
41 41
1 è!!!!!!!! 1 è!!!!!!!!
9x → I−69 + 4 295 M, y → I62 − 3 295 M==
41 41
Notice that in this example two of the solution pairs involve only real numbers,
and two involve complex numbers. The complex solutions are a conjugate pair.
4.5 Graphs
Consider that F (x, y) = 0 has been solved for y so that y = f (x). We wish to give a geometric
interpretation to the equation y = f (x). Now if a value, say x1 , is assigned to x, then, if f (x)
is single-valued, there will be determined a single value y, say y1 . Another value of x, say x2 ,
will produce a value y2 . If f (x) is multiple-valued, there will be several values of y for a given
x. In any event the real number pairs (x1 , y1 ) which satisfy y = f (x) may be plotted in two
dimensions as points in the plane. The aggregate of these points constitutes the graph or plot
of the equation y = f (x) or of the function f (x).
This is one of the central problems in plane analytic geometry: given a function y = f (x),
to plot its graph or to represent it geometrically. We sometimes say that the graph of f (x) is
the locus of f (x). The word locus, in general, carries with it the idea of motion. Thus, the
curve traced by a moving point is called the locus of the point. Such a locus is also referred
to as a curve in the plane.
Through the study of equations much can be learned about the geometric properties of
graphs. Such analysis is one of the roles of analytic geometry. In the study of an equation
y = f (x) there are many analyses that can be made in order to intuitively understand the
behavior of the graph. Mathematica and Descarta2D can be used to aid in this understanding.
Four properties of significant interest in analytic geometry are
4.6 Parametric Equations 47
Intercepts The points at which the curve crosses the x- and y-axes.
Extent The regions of the plane to which the curve is confined and regions where it tends to
infinity.
Symmetry The lines in which the reflection of the curve is a mirror image of the curve itself.
Cases of interest include symmetry about the x- or y-axes, symmetry about the origin,
and symmetry about the lines y = x or y = −x.
Asymptotes The behavior of an unbounded curve in the neighborhood of infinity, where
either x, y, or both become infinite. In particular, it may happen that the distance
from a point P on the curve to some fixed line tends to zero. Such a line is called an
asymptote of the curve.
The set of all points which satisfy a given condition is called the locus of that condition.
An equation is called the equation of the locus if it is satisfied by the coordinates of every
point on the locus and by no other points. There are three common representations of the
locus by means of equations:
This book focuses on rectangular and parametric equations, with polar equations covered in
the explorations.
Solution. Let the parameter θ be the angle measured counter-clockwise from the
+x-axis that a line segment of length 2 sweeps when anchored at the origin (0, 0).
Using trigonometry the x- and y-coordinates of the end point of the line segment
are given by the parametric equations
-2 -1 1 2
-1
-2
In our study of curves in the plane we will examine both implicit and parametric equations
for the curves.
4.7 Explorations
Determinants.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .deter.nb
Determinants often provide a concise notation for expressing relationships in analytic geom-
etry. Show that the expanded algebraic form for the 2 × 2 determinant
a b
1 1
a2 b 2
is given by −a2 b1 + a1 b2 . Show that the expanded algebraic form for the 3 × 3 determinant
a1 b1 c1
a 2 b 2 c2
a 3 b 3 c3
4.7 Explorations 49
is given by −a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3 .
—–
Cramer’s Rule (Two Equations). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cramer2.nb
Show that the solution to the system of two linear equations in two unknowns
a 1 x + b 1 y + c1 = 0
a 2 x + b 2 y + c2 = 0
is given by the determinants
−c a −c1
1 b1 1
−c2 b2 a2 −c2
x= and y = ,
D D
where
a b1
1
D= .
a2 b2
—–
Cramer’s Rule (Three Equations). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cramer3.nb
Show that the solution to the system of three linear equations in three unknowns
a1 x + b1 y + c1 z + d1 = 0
a2 x + b2 y + c2 z + d2 = 0
a3 x + b3 y + c3 z + d3 = 0
is given by the determinants
−d1 b1 c1 a1 −d1 c1 a1 b1 −d1
−d2 b2 c2 a2 −d2 c2 a2 b2 −d2
−d3 b3 c3 a3 −d3 c3 a3 b3 −d3
x= , y= , and z =
D D D
where
a1 b1 c1
D = a2 b2 c2 .
a3 b3 c3
—–
Polar Equations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polareqn.nb
A curve in polar coordinates may have more than one equation. A given point may have
either of two general coordinate representations
(r, θ + 2kπ),
(−r, θ + (2k + 1)π),
50 Chapter 4 Equations and Graphs
for any integer k. Hence a given curve r = f (θ) may have either of the two equation forms
r = f (θ + 2kπ),
−r = f (θ + (2k + 1)π).
The first equation reduces to r = f (θ) when k = 0, but may lead to an entirely different
equation of the same curve for another value of k. Similarly, the second equation may yield
other equations of the curve. Show that in spite of the potential for multiple equations in
polar coordinates, a linear equation Ax + By + C = 0 has only one representation in polar
coordinates given by
r(A cos θ + B sin θ) + C = 0.
—–
Chapter 5
The curve with the simplest equation is a straight line. There are many forms the equation
can exhibit, depending on how we wish to construct the line. This chapter develops in detail
the analytic geometry of a line and its close relation, the line segment.
Ax + By + C = 0.
The graph of such a linear equation is a straight line. In Descarta2D the line Ax + By + C = 0
is represented as Line2D[A, B, C]. Points (x, y) whose coordinates satisfy the equation
Ax + By + C = 0 are said to be on the line.
A line segment is the set of points on a line between two points on the line, P0 (x0 , y0 ) and
P1 (x1 , y1 ). In Descarta2D a line segment is represented as Segment2D[coords, coords] where
the coords are lists of the (x, y) coordinates of the start and end points of the line segment.
51
52 Chapter 5 Lines and Line Segments
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
Example. Determine which of the points (−1, 1), (2, 53 ), (3, 1) and (−3, − 35 ) are
on the line 2x − 3y + 1 = 0.
Solution. The Descarta2D function IsOn2D[point, line] returns True if the point
is on the line.
3 3
2 2
1 1
0 0
-1 -1
-2 -2
-4 -2 0 2 4 -4 -2 0 2 4
5.1 General Equation 53
y
P2 Hx2 , y2 L
y2 - y1
P1 Hx1 , y1 L q
x2 - x1
q
x
Example. Find the angle of inclination (in degrees) and the slope of the line
x − y + 4 = 0. Find the slope of the line segment between the points (−2, 1) and
(3, 2).
Solution. The function IsParallel2D[line, line] will return True if the two
lines are parallel; otherwise, it returns False. IsPerpendicular2D[line, line]
returns True if the two lines are perpendicular; otherwise, it returns False.
Therefore, the lines in pair (a) are parallel, the lines in pair (b) are perpendicular,
and the lines in pair (c) are neither parallel or perpendicular.
3 4 3
2 2 2
1 1
0 0 0
-1 -2 -1
-2 -4 -2
-4 -2 0 2 4 -4-2 0 2 4 -4 -2 0 2 4
tan θ2 − tan θ1
tan θ12 = tan (θ2 − θ1 ) =
1 + tan θ1 tan θ2
which, in terms of slopes of the lines, yields
m2 − m1
tan θ12 = .
1 + m1 m2
56 Chapter 5 Lines and Line Segments
Example. Determine the angle (in radians) between the lines x + 3y − 4 = 0 and
−2x + 2y + 1 = 0.
Solution. The Descarta2D function Angle2D[line, line] returns the angle between
the two lines (measured in radians from the first line to the second line).
In[9]: Angle2D@l1 = Line2D@1, 3, −4D, l2 = Line2D@−2, 2, 1DD êê N
Out[9] 1.10715
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
Out[11] 2.03444
The angle between the lines taken in the opposite order is 2.0344 radians (approx-
imately 116.565◦) which is the supplement of the first angle (63.435◦ + 116.565◦ =
180◦).
(x − x1 )(y − y2 ) = (x − x2 )(y − y1 ).
5.4 Two–Point Form 57
P2 Hx2 , y2 L
PHx, yL
y2 - y1
y - y1
P1 Hx1 , y1 L x - x1
x2 - x1
− (y2 − y1 ) x + (x2 − x1 ) y + x1 y2 − x2 y1 = 0.
Example. Determine the line through the points (−2, −1) and (3, 2).
2
1
0
-1
-2
-4 -2 0 2 4
Collinear Points
In a previous chapter it was demonstrated that the three points P1 (x1 , y1 ), P2 (x2 , y2 ) and
P3 (x3 , y3 ) are collinear if their coordinates satisfy the determinant equation
x1 y1 1
x2 y2 1 = 0.
x3 y3 1
This condition may be stated in a more intuitive form using the two–point form of a line.
The line defined by P1 and P2 must be satisfied by P3 yielding the condition
− (y2 − y1 ) x3 + (x2 − x1 ) y3 + x1 y2 − x2 y1 = 0
mx − y + (y1 − mx1 ) = 0.
5.5 Point–Slope Form 59
1
P1 Hx1 , y1 L
A vertical line cannot be represented in point–slope form. In determinant form the point–slope
form is given by
x y 1
x1 y1 1 = 0.
1 m 0
Example. Determine the line through the point (1, 2) with a slope of 1/2.
1 3
Out[15] Line2DA , −1, E
2 2
3
2
1
0
-1
-4 -2 0 2 4
60 Chapter 5 Lines and Line Segments
A2 x + B2 y + C2 = 0
would have a slope m = −A2 /B2 , and using mx − y + (y1 − mx1 ) = 0 yields
A2 x + B2 y − (A2 x1 + B2 y1 ) = 0.
B2 (x − x1 ) = A2 (y − y1 ).
A2 x + B2 y + C2 = 0
would have a slope m = −1/m2 = B2 /A2 , and using mx − y + (y1 − mx1 ) = 0 yields
B2 x − A2 y + (A2 y1 − B2 x1 ) = 0,
Example. Find the lines through the point (2, 1) which are parallel and perpen-
dicular to the line 3x − 2y + 1 = 0.
4
2
0
-2
-4
-2 0 2 4
Descarta2D Hint. The function Line2D[point, line] returns the same results
as Line2D[point, line, Perpendicular2D]; the keyword Perpendicular2D is op-
tional and may be omitted.
Similarly, a vertical line (whose slope is infinite) has the equation x−x1 = 0 and its determinant
equation is
x y 1
x1 y1 1 = 0.
0 1 0
62 Chapter 5 Lines and Line Segments
Example. Find the horizontal and vertical lines through the point (3, 2).
4
2
0
-2
-4
-4 -2 0 2 4
P1 H0, bL
3
2
1
0
-1
-2
-3
-2-1 0 1 2 3
P2 H0, bL
P1 Ha, 0L
x
Solution. The function Line2D[point, point] constructs a line through the two
points.
In[25]: p1 = Point2D@82, 0<D;
p2 = Point2D@80, 1<D;
l12 = Line2D@p1, p2D
3
2
1
0
-1
-4 -2 0 2 4
r L
r sinHqL
q
O r cosHqL x
3 4 2 1 3
Out[27] 9Line2DA , − , −1E, Line2DA
è!!! ,
è!!! , −
è!!! E=
5 5 5 5 5
Example. Find the line 4 units from the origin whose normal makes an angle of
30◦ with the positive x-axis.
Solution. We apply directly the normal form of a line to determine the coefficients
of the line in general form.
In[28]: Line2D@Cos@30 DegreeD, Sin@30 DegreeD, −4D êê N
Example. Offset the points (−1, 1), (1, −1) and (0, 0) a distance 2 in both direc-
tions along the line 3x − 4y + 1 = 0.
3 11 13 1
Out[30] 99Point2DA9 , =E, Point2DA9− , − =E=,
5 5 5 5
13 1 3 11
9Point2DA9 , =E, Point2DA9− , − =E=,
5 5 5 5
8 6 8 6
9Point2DA9 , =E, Point2DA9− , − =E==
5 5 5 5
3
2
1
0
-1
-2
-4 -2 0 2 4
68 Chapter 5 Lines and Line Segments
Example. Find and plot the two lines offset a distance of two units from the line
x − 3y + 1 = 0.
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
Example. Find the distance from the point (3, −2) to the line 3x − 4y + 2 = 0.
19
Out[34]
5
A1 x + B1 y + C1 = 0
A2 x + B2 y + C2 = 0
for the intersection point P (x, y). The resulting formula for the coordinates of point P is
B1 C2 − B2 C1 A1 C2 − A2 C1
, , A1 B2 − A2 B1 6= 0.
A1 B2 − A2 B1 A1 B2 − A2 B1
In the case where the denominators are zero, the lines are either parallel or coincident. If the
lines are coincident the ratio of their corresponding coefficients will be a constant
A1 B1 C1
k= = = ,
A2 B2 C2
and the conditions
A −C A −C1
1 B1 1 B1 1
= 0, = 0 and =0
A2 B2 −C2 B2 A2 −C2
Example. Find the intersection point of the two lines whose equations are
2x − 3y + 7 = 0 and 3x + 7y − 2 = 0.
43 25
Out[35] Point2DA9− , =E
23 23
4
3
2
1
0
-1
-4 -2 0 2 4
The coordinates of the projected point can also be written in a somewhat more intuitive form
given by
(x1 − ad, y1 − bd)
where
A B Ax1 + By1 + C
a= √ , b= √ and d = √ .
2
A +B 2 2
A +B 2 A2 + B 2
Simple algebra confirms that the two forms are equivalent. If the point P1 (x1 , y1 ) is on the
line, then it is clear from the second form that the projected point P2 has coordinates (x1 , y1 )
since d, which is the signed distance from the point to the line, is equal to zero when P1 is
on L2 . As shown in the next example, Descarta2D provides a specific function that projects a
point onto a line.
1 1
Out[38] Point2DA9− , =E
2 2
In[39]: Sketch2D@8p1, p2, l2<, PlotRange −> 88−4, 1<, 8−1, 4<<D;
4
3
2
1
0
-1
-3 -2 -1 0 1
72 Chapter 5 Lines and Line Segments
1
Out[40] Line2DA−x0 + x1, −y0 + y1, Hx02 − x12 + y02 − y12LE
2
Example. Find the line that is the perpendicular bisector of the line segment
bounded by the points (−3, −1) and (5, 3).
4
2
0
-2
-4
-2 0 2 4
5.12 Angle Bisector Lines 73
A1 x + B1 y + C1 A2 x + B2 y + C2
d=± p and d = ± p 2 .
2
A1 + B1 2 A2 + B22
Equating the two yields the equation of the angle bisectors given by
A1 x + B1 y + C1 A2 x + B2 y + C2
p =± p 2 .
2
A1 + B1 2 A2 + B22
Example. Find and plot the angle bisector lines of the lines x − 3y + 2 = 0 and
x + 4y − 2 = 0.
4
2
0
-2
-4
-4 -2 0 2 4
Out[46] 8Line2D@y0 − y1, −x0 + x1, −x1 y0 + x0 y1D, Line2D@y0 − y2, −x0 + x2, −x2 y0 + x0 y2D,
Line2D@y0 − y3, −x0 + x3, −x3 y0 + x0 y3D<
We now extract the coefficients of the lines and apply the postulated determinant.
In[47]: 8A1, B1, C1< = List @@ l1;
8A2, B2, C2< = List @@ l2;
8A3, B3, C3< = List @@ l3;
Det@88A1, B1, C1<,
8A2, B2, C2<,
8A3, B3, C3<<D êê Simplify
Out[47] 0
5.14 Pencils of Lines 75
The condition defined by the determinant is therefore necessary; it is also sufficient provided
the slopes of the lines are distinct.
Out[48] True
6
4
2
0
-2
-4
-6-4-2 0 2 4 6
Assume that L1 and L2 intersect in some point P (x, y); then, by definition, L1 (x, y) = 0 and
L2 (x, y) = 0, since P is on both lines. Furthermore, L now represents a family, or system,
of lines passing through P . Such a family of lines is called a pencil of lines. The variable
k can be set to a value in a manner that produces a line in the pencil that will satisfy one
additional condition. This is a useful technique for solving certain types of geometric problems
as demonstrated in the next example.
Example. Find the family (pencil) of lines that pass through the intersection
point of x − 2y + 4 = 0 and 2x + 3y − 2 = 0. Find the value of k and the associated
member of the family that passes through the point (4, 2).
In[50]: Clear@kD;
L3 = Line2D@L1 = Line2D@1, −2, 4D,
L2 = Line2D@2, 3, −2D, k, Pencil2DD
Out[50] Line2D@1 + k, −2 H1 − kL + 3 k, 4 H1 − kL − 2 kD
Out[51] 4 H1 − kL − 2 k + 4 H1 + kL + 2 H−2 H1 − kL + 3 kL == 0
1
Out[52] 99k → − ==
2
3
2
1
0
-1
-2
-4 -2 0 2 4
5.14 Pencils of Lines 77
y
L
PHx, yL
1
sinHqL
P1 Hx1 , y1 L q
cosHqL
Clearly, the point P1 (x1 , y1 ) is on L as the coordinates of P1 satisfy the equation of L. Also,
since the slope m of L is given by
− sin θ
m= = tan θ
− cos θ
we can create a line with any given slope. A vertical line, whose slope is infinite, can be
represented using θ = π/2. A complete pencil of lines, therefore, can be created for values
0 ≤ θ < π.
Example. Find the parametric equation of a pencil of lines passing through the
point (2, 3).
In[54]: Clear@tD;
l1 = Line2D@Point2D@82, 3<D, t, Pencil2DD
6
4
2
0
-2
-4
-4 -2 0 2 4 6
A simpler parameterization involves applying the point–slope form of a line and using the
slope, m, as the parameter of the pencil. This approach yields the parameterized pencil of
lines
mx − y + y1 − mx1 = 0.
This parameterization, however, cannot represent vertical lines.
A1 C1 B1 C1
Out[56] Point2DA9−
2 , −
2 =E
2
A1 + B1 A1 + B1
2
P0 Hx0 , y0 L
t
at
Pt Hx0 +
- b t, y0 - a tL
bt
O x
(y0 − at) − y0 a A1
m= =− =−
(x0 + bt) − x0 b B1
which is the slope of the desired line, L1 . Therefore, the parametric equations of the line are
A1 C1 B1 t
x = − +p 2
A21 + B12 A1 + B12
B1 C1 A1 t
y = − 2 −p 2 .
A1 + B12 A1 + B12
3
2
1
0
-1
-4 -2 0 2 4
Ÿ applies
Mathematica Hint. The Mathematica function Map[f, expr] (or f /@ expr)
to f to each element on the first level in expr. In the previous example
Map is used to evaluate a line using a list of parameter values.
Line Segment
We wish to define the parametric equations for a line segment such that the parameter value
t = 0 produces the coordinates of the start point P0 , t = 1 produces the coordinates of the
end point P1 , and values 0 < t < 1 produce coordinates of points proportionally spaced in
between P0 and P1 . Let d be the distance from P0 to a general point P (x, y) on the directed
line P0 P1 . We use Descarta2D to produce the formulas for the coordinates of P :
p
Let t = d/D where D = (x2 − x1 )2 + (y2 − y1 )2 is the distance from P0 to P1 . Solving
for d = tD and substituting d into the Mathematica output above yields the parametric
equations
x = x1 + t(x2 − x1 )
y = y1 + t(y2 − y1 ).
Example. Find the coordinates of the points at parameter values 0, 1/2 and 1
on the line segment whose start and end points are (−2, 1) and (1, 0), respectively.
To what point does the parameter value t = −1 correspond? Plot the objects.
1 1
Out[60] 98−5, 2<, 8−2, 1<, 9− , =, 81, 0<=
2 2
2
1.5
1
0.5
0
-5 -4 -3 -2 -1 0 1
5.16 Explorations
Distance between Parallel Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .lnsdst.nb
Demonstrate that the distance, d, between two parallel lines
Ax + By + C1 = 0 and Ax + By + C2 = 0
is given by r
(C2 − C1 )2
d= .
A2 + B 2
—–
Intersection of Lines in Intercept Form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . intrsct.nb
Show that the point of intersection of the lines
x y x y
+ = 1 and + =1
a b b a
is
ab ab
, .
(a + b) (a + b)
—–
82 Chapter 5 Lines and Line Segments
—–
Line General Equation Determinant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .lndet.nb
Show that the general equation of a line Ax + By + C = 0 is coincident with the line
x y 1
−AC −BC A2 + B 2 = 0.
B −A 0
—–
5.16 Explorations 83
Circles
The circle is the first curve we will study whose equation is of the second degree. Circles have
been studied since antiquity and there exists an enormous number of interesting properties,
theorems and relationships involving circles. This chapter provides the underlying analytic
geometry of a circle and provides a glimpse at some of the catalog of knowledge about circles.
Example. Write the equation of a circle with center at (−1, 1) and radius 2. Plot
the circle.
85
86 Chapter 6 Circles
y
PHx, yL
r y-k
CHh, kL
x-h
4
2
0
-2
-4
-4 -2 0 2 4
Example. Determine which of the following points are on the circle centered at
(−2, 1) with radius 3: (a) (3, 4), (b) (1, 1), (c) (−2, 4).
(x + 2)2 + (x − 1)2 = 9
are on the circle. The Descarta2D function IsOn2D[point, circle] will return True
if the point is on the circle; otherwise, it returns False.
6.1 Definitions and Standard Equation 87
Therefore, points (b) and (c) are on the circle, and point (a) is not.
4
3
2
1
0
-1
-2
-4 -2 0 2
Two circles are said to be concentric if their center points are coincident. Two circles are
coincident if their center points are coincident and their radii are equal.
Example. Show that the two circles whose equations are (x − 1)2 + (y − 2)2 = 4
and (x − 1)2 + (y − 2)2 = 9 are concentric, but not coincident.
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where the coefficients of x2 and y 2 are equal and there is no xy term. Therefore, a necessary
and sufficient condition that Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0 represent a circle is that
A = C and B = 0. It is not necessary that A = C = 1 since the coefficients of x2 and y 2
being equal can be divided out, reducing them to one. The equation
x2 + y 2 + ax + by + c = 0
is the general equation of a circle. It can be reduced to standard form by completing the
squares on the x2 - and x-terms, then on the y 2 - and y-terms yielding
a2 b2 a2 b2
x2 + ax + + y 2 + by + +c− − =0
4 4 4 4
or 2
a 2 b a2 + b2 − 4c
x+ + y+ = .
2 2 4
√ the equation of a circle whose center is at (−a/2, −b/2) and whose radius is given by
This is
r = 12 a2 + b2 − 4c. The equation will be a real circle only if a2 +b2 −4c > 0; if a2 +b2 −4c = 0
the equation represents a single point (a circle of zero radius); and if a2 + b2 − 4c < 0 there
are no real points in the locus.
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
as
Quadratic2D[A, B, C, D, E, F].
√
The center of the circle is (5/4, −1) and the radius is 97/4. The Descarta2D
function Quadratic2D[circle] converts a circle to a quadratic equation.
5 7
Out[6] Quadratic2DA1, 0, 1, − , 2, − E
2 2
1p
r= (x1 − x2 )2 + (y1 − y2 )2 .
2
One equation of the circle C has a particularly simple form given by
(x − x1 )(x − x2 ) + (y − y1 )(y − y2 ) = 0
This system of equations reduces to three linear equations in three unknowns, h, k and r.
Simultaneous solution of the three linear equations gives
H K d12 d13 d23
h=− , k= , and r = ,
2D 2D 2|D|
where
1 1 1 1 1 1 1 1 1
H = y1 y2 y3 , K = x1 x2 x3 , D = x1 x2 x3 ,
s1 s2 s3 s1 s2 s3 y1 y2 y3
and q
dij = (xi − xj )2 + (yi − yj )2 and si = x2i + yi2 .
If D = 0 the points are collinear and no circle passes through the three points.
Example. Find the circle passing through the three points (1, 2), (−3, 1) and
(0, −2).
7 3 17
Out[7] Circle2DA9− , =,
è!!! E
10 10 5 2
2
1
0
-1
-2
-3 -2 -1 0 1
The quadratic equation of a circle passing through three points P1 (x1 , y1 ), P2 (x2 , y2 ) and
P3 (x3 , y3 ) is given by the determinant equation
x2 + y 2 x y 1
2
x1 + y12 x1 y1 1
= 0.
x2 + y 2 x y 1
2 2 2 2
2
x3 + y32 x3 y3 1
Example. Find the quadratic equation of the circle passing through the three
points (1, 2), (−3, 1) and (0, −2) given in the previous example.
If r2 − d2 > 0 (the radius is greater than the distance from the center point to the line), then
there are two distinct intersection points; if r2 − d2 = 0, then the two intersection points are
coincident (the line is tangent to the circle); and if r2 − d2 < 0, then the line and the circle
do not intersect.
Example. Find the two points of intersection between the line and the circle
whose equations are 2x − y + 3 = 0 and (x − 1)2 + (y − 2)2 = 9.
7 1
Out[10] 9Point2D@81, 5<D, Point2DA9− , =E=
5 5
6
5
4
3
2
1
0
-1
-2
-2-10 1 2 3 4 5
r1 r2
Substituting this value for x back into the first equation and solving for y 2 yields
which confirms the intuitive insight that the circles do not intersect if either the sum of the
radii is greater than the distance between the centers, or the difference of the radii is less than
the distance between the centers.
Now consider two circles in arbitrary positions with centers C1 (h1 , k1 ) and C2 (h2 , k2 ) as
shown in Figure 6.3. The x- and y-coordinates of the intersection points can be written in
terms of the distances x0 and y0 determined from the special position shown in Figure 6.2 and
are given by
x = h1 + x1 ± x2 and y = k1 + y1 ∓ y2
where
x1 = x0 cos θ, x2 = y0 sin θ, y1 = x0 sin θ, y2 = y0 cos θ
94 Chapter 6 Circles
y0
x0
C2
y1
y2
C1
q
x1 x2
and
h2 − h1 k2 − k1
cos θ = and sin θ = .
D D
Therefore, the coordinates (x, y) of the intersection points of two circles without reference to
trigonometric functions are
(h2 − h1 ) (k2 − k1 )
x = h1 + x0 ± y0
D D
(k2 − k1 ) (h2 − h1 )
y = k1 + x0 ∓ y0 .
D D
evaluated numerically.
4
2
0
-2
-4
-6
-6 -4 -2 0 2 4
The inner radical represents the distance from point P the center of the circle. The validity
of the formula is easily verified by considering separately whether the point is inside, outside
or on the circle.
Example. Find the distance from (2, 3) to the circle (x + 2)2 + (y + 1)2 = 1.
C1 ≡ (x − h1 )2 + (y − k1 )2 = r12 and
C2 ≡ (x − h2 )2 + (y − k2 )2 = r22 .
Consider the equation C ≡ (1 − κ)C1 + κC2 = 0. This equation represents a circle since
it is of the second degree, the coefficients of x2 and y 2 are the same, and there is no xy
term. Moreover, points P1 and P2 are on the circle since both points satisfy the equation C.
Therefore, C represents a family (or pencil ) of circles through the points of intersection of the
two given circles. A particular member of this family may be determined by specifying that
it satisfy one other condition. Inspection of the equation reveals that C has a center (H, K)
and radius R, where
H = (1 − κ)h1 + kh2
K = (1 − κ)k1 + kk2
R1 = h21 + k12 − r12
R2 = h22 + k22 − r22
p
R = H 2 + K 2 − ((1 − κ)R1 + κR2 ).
In[15]: Clear@kD;
c1 = Circle2D@82, 1<, 3D;
c2 = Circle2D@8−2, −3<, 4D;
c12 = Circle2D@c1, c2, k, Pencil2DD êê Simplify
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!2
Out[15] Circle2DA82 − 4 k, 1 − 4 k<, 9 − 25 k + 32 k E
6.9 Radical Axis 97
è!!!!!!!! è!!!!!
Out[16] 9Circle2DA822, 21<, 934 E, Circle2DA818, 17<, 3 69 E,
è!!!!! è!!!!!!!! è!!!!!
Circle2DA814, 13<, 2 93 E, Circle2DA810, 9<, 187 E, Circle2DA86, 5<, 66 E,
è!!!!!
Circle2D@82, 1<, 3D, Circle2D@8−2, −3<, 4D, Circle2DA8−6, −7<, 87 E,
è!!!!!!!! è!!!!!!!!
Circle2DA8−10, −11<, 222 E, Circle2DA8−14, −15<, 421 E,
è!!!!!
Circle2DA8−18, −19<, 6 19 E=
40
20
-20
-40
-40 -20 0 20 40
This line is called the radical axis of the circles C1 and C2 . The radical axis possesses the
following properties which we state without proof.
• It is the line of the common chord if the two circles intersect in distinct real points.
• It is the common tangent line if the circles intersect in coincident points (are tangent
internally or externally).
• It is a real straight line even if the circles do not intersect in real points.
• It is the locus of points from which tangents of equal length can be drawn to the two
circles.
• It is perpendicular to the line of centers of the two circles.
98 Chapter 6 Circles
• It does not exist (tends to infinity) as the defining circles tend to concentricity.
• The radical axes of three circles, taken in pairs, intersect in a point called the radical
center.
Example. Find the radical axis of the circles (x − 4)2 + (y − 1)2 = 16 and
(x − h)2 + (y − 1)2 = 4 for values of h = {5, 6, 10, 11}.
Solution. The Descarta2D function Line2D[circle, circle] returns the radical axis
of the two circles.
In[18]: c1 = Circle2D@84, 1<, 4D;
Out[19] 8Circle2D@85, 1<, 2D, Circle2D@86, 1<, 2D, Circle2D@810, 1<, 2D,
Circle2D@811, 1<, 2D<
6 6
4 4
2 2
0 0
-2 -2
-4 -4
0 2 4 6 8 1012 0 2 4 6 8 1012
6 6
4 4
2 2
0 0
-2 -2
-4 -4
0 2 4 6 8 1012 0 2 4 6 8 1012
Ÿ Mathematica
{1, 2, 3, 4}.
Hint. The Mathematica function Range[1,4] returns the list
6.10 Parametric Equations 99
where (h, k) is the center of the circle and r is the radius of the circle. Values in the range
0 ≤ θ < 2π generate a complete locus of points on the circle.
Solution. The Descarta2D function Circle2D[{h, k}, r][t] returns the coordi-
nates of a point at parameter t on the circle.
In[22]: c1 = Circle2D@80, 0<, 2D;
pts = Map@Point2D@c1@#DD&, 2 ∗ Pi ∗ Range@0, 12D ê 12D;
Sketch2D@8c1, pts<D;
2
1
0
-1
-2
-2 -1 0 1 2
Alternately, consider the triangle T shown in Figure 6.4. Triangle T is obviously a right
triangle since
(1 − t2 )2 + (2t)2 = (1 + t2 )2 .
Therefore, the rational forms of the trigonometric functions for angle θ are
1 − t2
sin θ = and
1 + t2
2t
cos θ = .
1 + t2
Substituting these expressions into the parameterization of a circle previously given yields
1 − t2 2t
x=h+r 2
and y = k + r .
1+t 1 + t2
100 Chapter 6 Circles
t2 + 1
1 - t2
q
2t
These equations are called the rational parameterization of the circle and have the advantage
that they can be evaluated without using trigonometric functions. Parameter values in the
range 0 ≤ t ≤ 1 produce coordinates of points on the circle in the first quadrant, 1 ≤ t < ∞ the
second quadrant, −∞ < t ≤ −1 the third quadrant, and −1 ≤ t ≤ 0 in the fourth quadrant.
The point at θ = π radians cannot be generated using these equations, so they are generally
applied only to coordinates in the first quadrant. Also, notice that the points generated by
these parametric equations do not produce equally spaced points measured by distance along
the circle for equally spaced parameter values.
Solution. The points can be generated directly from the equations using para-
meter values 0, 18 , 14 , 38 , 12 , 58 , 34 , 78 and 1 .
In[23]: c1 = Circle2D@80, 0<, 5D;
pts = Map@Point2D@5 81 − # ^ 2, 2 #< ê H# ^ 2 + 1LD&, Range@0, 8D ê 8D;
Sketch2D@8c1, pts<, PlotRange −> 88−1, 6<, 8−1, 6<<D;
6
5
4
3
2
1
0
-1
0 1 2 3 4 5 6
6.11 Explorations 101
6.11 Explorations
Polar Equation of a Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarcir.nb
Show that the polar equation of a circle centered at P (r1 , θ1 ) with radius R is given by
—–
Angle Inscribed in a Semicircle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rtangcir.nb
Show that an angle inscribed in a semicircle is a right angle.
—–
Chord Length of Intersecting Circles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . chdlen.nb
r1 r2
d
C1 C2
Show that the distance, d, between the intersection points of two circles is given by
p
−(D − r1 − r2 )(D + r1 − r2 )(D − r1 + r2 )(D + r1 + r2 )
d=
D
where D is the distance between the centers of the circles, and r1 and r2 are the radii of the
two circles.
—–
Johnson’s Congruent Circle Theorem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . johnson.nb
Take any three circles C1 , C2 and C3 which pass through the origin, have equal radii, r,
and intersect in pairs in two distinct points (one of the points is, by construction, the origin).
Prove that the circle passing through the other three points of intersection between the circles
taken in pairs is congruent to the original three circles (that is, this circle has a radius of r).
—–
Radical Center. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .radcntr.nb
Prove that the radical axes of three circles taken in pairs intersect in a common point. This
point is called the radical center of the three circles.
—–
102 Chapter 6 Circles
P0
r1 x
C1
Show that the locus of midpoints from a fixed point P0 to a circle C1 of radius r1 , is a circle
of radius 12 r1 . Furthermore, show that the center point of the locus is the midpoint of the
segment between P0 and the center of C1 .
—–
Circle Through Three Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cir3pts.nb
Show that the equation of the circle through the three points (0, 0), (a, 0) and (0, b) is
x2 + y 2 − ax − by = 0.
—–
Construction of Two Related Circles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tnlncir.nb
Prove that if OP and OQ are the tangent lines from (0, 0) to the circle
x2 + y 2 + 2gx + 2f y + c = 0,
x2 + y 2 + gx + f y = 0.
—–
Circle of Apollonius. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . apollon.nb
Show that the locus of a point P (x, y) that moves so that the ratio of its distance from two
fixed points P1 (x1 , y1 ) and P2 (x2 , y2 ) is a circle with radius
dk
r=p
(k − 1)2
2
6.11 Explorations 103
and center
−x1 + k 2 x2 −y1 + k 2 y2
,
k2 − 1 k2 − 1
where d = |P1 P2 |. The locus is called the Circle of Apollonius for the points P1 and P2 and
the ratio k.
—–
Carlyle Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . carlyle.nb
Given a circle, C1 , passing through the three points (0, 1), (0, −p) and (s, −p), show that
the x-coordinates of the intersection points P1 (x1 , 0) and P2 (x2 , 0) of C1 with the x-axis are
the roots of the quadratic equation x2 − sx − p = 0.
—–
Castillon’s Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . castill.nb
Let P1 , P2 and P3 be three points inside the circle C1 ≡ x2 + y 2 = 1. Describe a method
for inscribing a triangle inside C1 such that the sides of the triangle pass through the three
given points.
—–
Radical Axis Ratio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . raratio.nb
Show that the point of intersection of the radical axis and the line of centers of two circles
of radii r1 and r2 divides the segment between the two centers into the ratio
d2 + r12 − r22
,
d2 − r12 + r22
Arcs
7.1 Definitions
Consider the parametric equations of a circle
where the point C(h, k) is the center of the circle and r is the radius of the circle. A circle
is defined to be the set of points P (x, y) for all values of θ such that 0 ≤ θ < 2π (radians).
Using the same parametric equations, a circular arc may be defined to be the set of points
P (x, y) for all values of θ such that θ0 ≤ θ ≤ θ1 , where 0 ≤ θ0 < 2π and θ0 < θ1 < (θ0 + 2π).
The point P0 (x0 , y0 ) where θ = θ0 is called the start point of the arc, and the point P1 (x1 , y1 )
where θ = θ1 is called the end point of the arc. The angle the directed line CP0 makes with
the +x-axis is called the start angle of the arc; the angle the directed line CP1 makes with
the +x-axis is called the end angle of the arc. The center point C(h, k) of the circle is also
the center point of the arc, and the radius, r, of the circle is the radius of the arc.
Let CP0 and CP1 be the lines determined by the center point C and the start and end
point of the arc, respectively. The angle between lines CP0 and CP1 is called the angular
span of the arc. An arc with an angular span of π radians (180◦ ) is called a semicircle. The
area bounded by line segments CP0 and CP1 and the arc itself is called a sector. The area
105
106 Chapter 7 Arcs
y
P1
r P0
q1
q0
CHh, kL
bounded by the arc and P0 P1 is called a segment and the line segment P0 P1 itself is called
the chord of the arc.
Example. Plot the arc centered at the point (−2, 1) with a radius 6 and start
angle of π/6 radians and end angle of π/2 radians. Include the center point of the
arc in the plot.
7
6
5
4
3
2
1
-2 -1 0 1 2 3
7.2 Bulge Factor Arc 107
y
Pm
P1
PM
r H
P0
C r
D
2H
B=
D
where D is the distance between P0 and P1 and H is the distance from Pm to the chordal
line defined by P0 and P1 . Thus, an arc with B = 1 will be a semicircle. Closer examination
of the definition of the bulge factor arc reveals that for a given value of B there are two arcs
satisfying the definition. These arcs are mirror images of each other (the line passing through
P0 and P1 is the reflection line). To distinguish between these two arcs we make the arbitrary
definition that the arc will be traversed counter-clockwise from P0 to P1 . The mirrored arc is
represented by interchanging the roles of P0 and P1 .
or
2
D
(r − H)2 + = r2 .
2
Solving for r and substituting H = BD/2 yields
D 1
r= B+
4 B
x0 + x1 y0 + y1
h= + κ(y0 − y1 ) and k = − κ(x0 − x1 )
2 2
where
1 1
κ= −B .
4 B
It is clear from the expressions for r and C that if we replace B with 1/B we get an arc
with the same radius and center, whose locus is counter-clockwise from P1 to P0 . This arc
is the complement of the original arc. The reflection of the original arc in the chord may be
obtained by reversing the roles of P0 and P1 and using the same value, B, as the bulge factor.
Example. Plot the arc with end points (1, 0) and (0, 1) with a bulge factor of
1/2. Find the mirror image of the arc reflected in the chord.
Arc2D[coords0, coords1 , B]
where the start and end point coordinates are given as the first two arguments,
respectively, and the bulge factor is the third argument. The arc reflected in the
chord is constructed by reversing the roles of the start and end points.
1
0.8
0.6
0.4
0.2
0
0 0.2 0.4 0.6 0.8 1
Angles
Let θ be the angular span of a bulge factor arc defined by points P0 and P1 and bulge factor
B. Once again examining the right triangle CP0 PM reveals that
θ d/2
tan =
2 (r − H)
2B
= . (7.1)
(1 − B 2 )
Using the trigonometric identity
2 tan A
tan(2A) =
(1 − tan2 A)
we find that
θ
B = tan .
4
From this equation it is clear that if B < 1, the arc is a minor arc whose angular span is in
the range 0 < θ < π; if B > 1 the arc is a major arc with π < θ < 2π.
Let α denote the angle between the initial tangent vector, V0 , and the chord vector,
P1 − P0 , considered positive when V0 is clockwise from the chord vector, and negative when
V0 is counter-clockwise from the chord. Note that −π < α < π and |α| = θ/2. Therefore,
B = tan(α/2).
From Equation (7.1) we can derive an expression for B in terms of sin α and cos α as
follows
sin α k sin α s 2B
tan α = = = = .
cos α k cos α c (1 − B 2 )
110 Chapter 7 Arcs
(The positive root of the quadratic is selected in order to insure that B has the same sign as
s. If B turns out to be negative, then the arc’s start and end points are interchanged and the
absolute value of B is the positive bulge factor.) The constants s and c are some multiple of
sin α and cos α and immediately provide several useful techniques for constructing arcs. These
techniques are illustrated in the “Explorations” section at the end of this chapter.
Example. Find and plot the arc passing through the points (4, 2), (−2, 4), and
(0, −6).
Solution. The function Arc2D[point, point, point] returns an arc through three
points. The first and third points are assumed to be the end points of the arc
chord.
In[4]: p1 = Point2D@84, 2<D;
p2 = Point2D@8−2, 4<D;
p3 = Point2D@80, 6<D;
a1 = Arc2D@p1, p2, p3D êê N
6
5
4
3
2
1
0
-2-1 0 1 2 3 4
x = h + r cos(θ0 + t(θ1 − θ0 ))
y = k + r sin(θ0 + t(θ1 − θ0 ))
where (h, k) is the center of the arc, r is the radius, and θ0 and θ1 are the start and end angles,
respectively, of the arc.
Alternatively, since the standard form of an arc used in Descarta2D is
Arc2D[{x0, y0 }, {x1 , y1 }, B],
we seek parametric equations involving only the start and end point coordinates and the bulge
factor. The equations are given by
where β = 4 tan−1 (B) is the span of the arc and C(h, k) is the center point of the arc.
Parameter values in the range 0 ≤ t ≤ 1 generate coordinates covering the span of the arc.
Example. Plot eight equally spaced points on the arc between the points (−3, 2)
and (2, 1) with a bulge factor of 3/2
2
1
0
-1
-2
-3 -2 -1 0 1 2
Example. For the arc between the points P0 (−2, 1) and P1 (2, 2) with a bulge
factor of 3/2, use the parametric definition of an arc to find and plot the start
point, end point and midpoint of the arc.
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2 -1 0 1 2
Whereas the Descarta2D function arc[t] generates the coordinates of the point on
the arc at parameter t, the function Angle2D[arc, t] returns the angle (in radians)
on the arc at parameter t with respect to a horizontal line such as the x-axis.
In[9]: Angle2D@a1, 1 ê 2D êê N
Out[9] −1.32582
The arc tangent function used to implement these equations must be sophisticated enough
to assign the proper angle based on which quadrant the points are located in. Mathematica
provides such an arc tangent function that takes the numerator and denominator as separate
arguments and computes the angle in the proper quadrant.
Example. Plot the arc centered at the point (2, 1) with radius 1, and with start
and end points of (7, 1) and (2, 6).
Solution. The function Arc2D[point, r, {point, point}] returns a bulge factor arc
given the center point, radius, and start and end points.
114 Chapter 7 Arcs
2 i 5 5 y
Out[10] Arc2DA87, 1<, 82, 6<, j
j− +
è!!! zE
z
5 2 k 2 {
8
7
6
5
4
3
2
1
12345678
7.7 Explorations
Arc from Bounding Points and Entry Direction.. . . . . . . . . . . . . . . . . . . . . .arcentry.nb
Let P0 and P1 be the start and end points, respectively, of an arc and P be a third point
on the vector tangent to the arc at P0 . Show that
s = |(P − P0 ) × (P1 − P0 )|
c = (P − P0 ) · (P1 − P0 )
represent values of s and c useful for computing the bulge factor of the arc.
—–
Arc from Bounding Points and Exit Direction. . . . . . . . . . . . . . . . . . . . . . . . . .arcexit.nb
Let P0 and P1 be the start and end points of an arc, respectively, and P be a third point
on the vector tangent to the arc at P1 . Show that
s = |(P1 − P0 ) × (P − P1 )|
c = (P1 − P0 ) · (P − P1 )
7.7 Explorations 115
represent values of s and c useful for computing the bulge factor of the arc.
—–
Midpoint of Arc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .arcmidpt.nb
P1
P0
Show that the midpoint, P of a bulge factor arc between points P0 and P1 whose bulge factor
is B has coordinates
(x0 + x1 ) − B(y0 − y1 ) (y0 + y1 ) + B(x0 − x1 )
P , .
2 2
—–
Centroid of Semicircular Arc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . arccent.nb
Show that the centroid of the area bounded by a semicircular arc of radius r and its chord
is on the axis of symmetry at a distance
4r
H=
3π
from the chord of the arc.
—–
Chapter 8
Triangles
Even though a triangle is not easily represented by a single, simple equation, there exist so
many interesting properties of triangles that it is worth devoting a special chapter to them.
Even today, new relationships involving triangles continue to be discovered. Descarta2D imple-
ments the triangle as a named object to enable easy study of the mathematical relationships
arising from the geometry of a triangle.
8.1 Definitions
A triangle is a composite object consisting of the three line segments connecting three non-
collinear points. The line segments are called the sides of the triangle, and the points are
called the vertices of the triangle. The two line segments adjacent to each vertex form an
angle inside the triangle called a vertex angle.
A triangle is isosceles if two sides are equal in length, and the third side is called the base.
In an equilateral triangle all three sides are equal length. A triangle is called acute if all the
interior angles measure less than 90◦ . A right triangle has one interior angle of 90◦ , and the
side opposite the right angle is called the hypotenuse. A triangle with an interior angle greater
than 90◦ is called an obtuse triangle. A triangle with three unequal sides is a scalene triangle.
It is clear from Figure 8.1 that the sum of the interior angles of a triangle is 180 degrees (π
radians).
Example. Plot the triangle connecting the points (−1, −1), (2, 0) and (−2, 1).
Use Descarta2D functions to retrieve the vertex points and vertex angles of the
triangle (in degrees).
117
118 Chapter 8 Triangles
P3
q1 q2 q3 L3
q1 q3
P1 L12 P2
where coords1 , coords2 and coords3 are the coordinates of the first, second and
third vertex points, respectively. The Descarta2D function Point2D[triangle, n]
returns a point located at vertex n of the triangle. Angle2D[triangle, n] returns
the vertex angle at vertex n of the triangle.
In[2]: Sketch2D@8t1<D;
1
0.5
0
-0.5
-1
-2 -1 0 1 2
7 5 7 10 1
Out[3] Triangle2DA9 , =, 9− , =, 9 , 0=E
4 2 11 11 2
3 3
2.5 2.5
2 2
1.5 1.5
1 1
0.5 0.5
0 0
-0.5 -0.5
-1 -1
-1 0 1 2 3 -1 0 1 2 3
Example. Find the line segment and the line associated with the side connecting
vertices 2 and 3 of Triangle2D[{2, 3}, {-1, 2}, {-3, 2}].
y PHa, bL
D
Dy
QHd, 0L x
x2 - x1
The “balance point” of a planar area defined by bounding curves is called the center of gravity
of the area. When the material covering the area has a constant density throughout, and the
formulas for the center of gravity depend purely on the size and shape of the area, the center
of gravity is called the centroid of the area. For symmetric geometric figures such as a square,
circle or ellipse, the centroid is obviously the center point of the figure.
Referring to Figure 8.2 it is intuitively obvious that the triangle will “balance” on some
horizontal line at ordinate ȳ. The position of this line can be determined by summing the
moments, ∆M = D(x2 − x1 )∆y, of infinitesimal rectangles on either side of the line. The
value of ȳ is the ordinate at which the sum of the moments is equal on both sides of the line.
The usual method for determining ȳ is to use integral calculus and the actual derivation is
included as the exploration tricent.nb. The derivation shows that the line is one-third of
the distance from the base of the triangle to the apex, and the coordinates of the centroid, P ,
of the triangle are given by
x1 + x2 + x3 y1 + y2 + y3
P ,
3 3
where (x1 , y1 ), (x2 , y2 ) and (x3 , y3 ) are the coordinates of the triangle’s vertex points. The
centroid point coordinates can be determined by intersecting a pair of lines offset from the
sides of the triangle one-third of the distance from the side towards the opposite vertex.
The medians of a triangle are the lines connecting the vertices to the midpoints of the
opposite sides. The medians taken in pairs intersect in coincident points, and the point is the
centroid of the triangle as is shown by the following Descarta2D commands:
8.2 Centroid of a Triangle 121
1 1
Out[6] Point2DA9 Hx1 + x2 + x3L, Hy1 + y2 + y3L=E
3 3
Example. Find the centroid of the triangle whose vertices are (−2, −1), (3, 1),
and (0, 2). Show by plotting that the medians intersect at the centroid.
1 2
Out[7] Point2DA9 , =E
3 3
In[8]: 8c1, c2, c3< = 88−2, −1<, 83, 1<, 80, 2<<;
s12 = Segment2D@c1, c2D;
s13 = Segment2D@c1, c3D;
s23 = Segment2D@c2, c3D;
m1 = Segment2D@Point2D@c1D, Point2D@s23DD;
m2 = Segment2D@Point2D@c2D, Point2D@s13DD;
m3 = Segment2D@Point2D@c3D, Point2D@s12DD;
2
1.5
1
0.5
0
-0.5
-1
-2 -1 0 1 2 3
122 Chapter 8 Triangles
Example. Find the circle circumscribing the triangle whose vertices are (1, 2),
(−2, 4) and (−3, 1). Show by plotting that the perpendicular bisectors of the sides
of the triangle intersect at the center point of the circumscribed circle.
4
3
2
1
0
-1
-3 -2 -1 0 1 2
8.4 Inscribed Circle 123
The radius, R, of the circle circumscribing a triangle whose sides are of length s1 , s2 and
s3 is given by
s1 s 2 s 3
R= √
PS
where S = s1 + s2 + s3 and P = (−s1 + s2 + s3 )(s1 − s2 + s3 )(s1 + s2 − s3 ). This formula is
derived in the exploration trirad.nb.
h = (s1 x1 + s2 x2 + s3 x3 )/2s
k = (s1 y1 + s2 y2 + s3 y3 )/2s
p
r = (s − s1 )(s − s2 )(s − s3 )/s
where
p
s1 = (x2 − x3 )2 + (y2 − y3 )2
p
s2 = (x1 − x3 )2 + (y1 − y3 )2
p
s3 = (x1 − x2 )2 + (y1 − y2 )2
s = (s1 + s2 + s3 )/2.
Example. Find the circle inscribed in the triangle whose vertices are (−3, 3),
(3, 3) and (1, −3). Show by plotting that the angle bisectors of the sides of the
triangle intersect at the center of the inscribed circle.
-2
-4
-4 -2 0 2 4
The radius, r, of a circle inscribed in a triangle whose sides are of length s1 , s2 and s3 is
given by r
1 P
r=
2 S
where S = s1 + s2 + s3 and P = (−s1 + s2 + s3 )(s1 − s2 + s3 )(s1 + s2 − s3 ). This formula is
derived in the exploration trirad.nb.
V3
a3
s2 s1
a1 a2
V1 s3 V2
positive and the angles less than π radians. Generally, a unique triangle is determined by
specifying three of the six configuration parameters, although in two cases (AAA and SSA),
as outlined below, the configuration is ambiguous. The configurations requiring consideration
are enumerated as
AAS Angle-Angle-Side: The AAS configuration is specified by two angles and a side not
between them. For example, the configuration parameters a1 , a2 and s1 specify an AAS
configuration. In a valid configuration the sum of the two given angles must be less than
π radians, and such configurations admit a unique solution.
ASA Angle-Side-Angle: The ASA configuration is specified by two angles and the side be-
tween the angles. The configuration parameters a1 , s3 and a2 , for example, illustrate an
ASA configuration. The ASA configuration allows a unique solution if the sum of the
two angles is less than π radians.
SAS Side-Angle-Side: The SAS configuration involves two sides and the angle between them.
The configuration given by s1 , a3 and s2 is an example of an SAS configuration. The SAS
configuration specifies a unique solution for all values of the configuration parameters.
SSA Side-Side-Angle: SSA configurations (s1 , s2 and a1 , for example) are referred to as the
ambiguous case, because two valid solutions may exist. That is, two different sets of
configuration parameters representing two different triangles may satisfy the configura-
tion. In some cases (right triangles) only one solution may exist, and in other cases the
configuration may be inconsistent allowing no solutions.
SSS Side-Side-Side: Specifying three sides of a triangle determines a unique triangle, or may
be inconsistent if the length of one side is greater than or equal to the sum of the lengths
of the other two sides.
126 Chapter 8 Triangles
The process of determining the full set of configuration parameters given one of the cases
above is called solving the triangle. Solving triangles involves the application of three funda-
mental principles. In terms of the configuration parameters these three principles lead to the
following equations:
• Sum of the angles of a triangle is π radians: a1 + a2 + a3 = π.
• The Law of Sines (three equations):
s1 s2 s3
= = .
sin(a1 ) sin(a2 ) sin(a3 )
• The Law of Cosines (three equations):
When applying the Law of Sines or the Law of Cosines, care must be taken to properly
handle the ambiguous cases noting that sin(a) = sin(π − a), for example, when applying the
Law of Sines. The Descarta2D package D2DTriangle2D provides details illustrating how to
solve all the triangle configuration cases using these principles.
è!!!
"################
è!!!# 4− 3 1
Out[15] Triangle2DA80, 0<, 9 5 − 2 3 , 0=, 9 , =E
"################ è!!!# "################ è!!!#
5−2 3 5−2 3
8.5 Solving Triangles 127
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0 0.5 1 1.5 2
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0 0.2 0.4 0.6 0.8 1 1.2
128 Chapter 8 Triangles
8.7 Explorations
Circle Inscribed in a Right Triangle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rttricir.nb
Show that if r is the radius of a circle inscribed in a right triangle with sides a and b and
hypotenuse c, then r = 12 (a + b − c).
—–
Euler’s Triangle Formula. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . trieuler.nb
If T is a triangle, and P and r are the center and radius of the circle inscribed in T , and
Q and R are the center and radius of the circle circumscribing T , show that
d2 = R2 − 2rR
y PHa, bL
D
Dy
QHd, 0L x
x2 - x1
Show that the centroid of a triangle, as illustrated in the figure, is on a line at a distance
ȳ = b/3 from the base of the triangle.
—–
Altitude of a Triangle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . trialt.nb
The altitude from vertex A of 4ABC is a line segment from A perpendicular to the side
BC (or its extension). Show that the equation of the line containing the altitude from A is
where the coordinates of the vertices are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ).
—–
Triangle Altitude Length. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . triallen.nb
Show that the length, L, of a triangle’s altitude (from vertex V3 to side s1 ) is given by
p
(s1 + s2 − s3 )(s1 − s2 + s3 )(−s1 + s2 + s3 )(s1 + s2 + s3 )
L=
2s3
where s1 , s2 and s3 are the lengths of the triangle’s sides.
—–
Concurrent Triangle Altitudes.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .triconn.nb
Show that the three altitudes of any 4ABC are concurrent in a single point (x, y) whose
coordinates are given by
x0 y0
x= and y =
D D
130 Chapter 8 Triangles
where
and
x1 y1 1
D = x2 y2 1
x3 y3 1
and the coordinates of the vertices are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ). This point is called
the orthocenter of the triangle.
—–
Triangle Side Lengths from Altitudes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . trisides.nb
Prove that the lengths of a triangle’s sides whose altitudes are of lengths h1 , h2 and h3 are
given by
2h1 H1 2h2 H2 2h3 H3
s1 = , s2 = and s3 =
H H H
where H1 = h2 h3 , H2 = h1 h3 and H3 = h1 h2 , and
p
H = (H1 + H2 − H3 )(H1 − H2 + H3 )(−H1 + H2 + H3 )(H1 + H2 + H3 ).
—–
Triangle Radii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . trirad.nb
Prove that the radius, r, of a circle inscribed in a triangle is given by
r
1 P
r=
2 S
where S = s1 + s2 + s3 , P = (−s1 + s2 + s3 )(s1 − s2 + s3 )(s1 + s2 − s3 ) and s1 , s2 and s3
are the lengths of the triangle’s sides. Furthermore, prove that the radius, R, of the circle
circumscribing the triangle is given by
s1 s2 s3
R= √ .
PS
—–
Triangle Cevian Lengths. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tricev.nb
Prove that the length of the altitude, h1 , from vertex V1 of a triangle to the opposite side
of the triangle (whose length is s1 ) is given by
√
PS
h1 =
2s1
8.7 Explorations 131
Conics
Chapter 9
Parabolas
In the branch of mathematics known as celestial mechanics it is shown that an object, such as
a comet, that falls toward the sun “from infinity” would, if not deflected by the gravitational
attraction of other bodies, travel in a path whose shape is a parabola with the sun at its focus.
Projectiles in a vacuum on the surface of the earth travel in paths which are nearly parabolic,
and projectiles in the air approximate this path with greater or less precision according to
their speed, shape and weight. Humans also take advantage of the focusing properties of a
parabolic shape in the design of such artifacts as headlights, searchlights and various listening
and broadcasting devices. This chapter develops the underlying mathematics of a parabola.
9.1 Definitions
A parabola is the locus of a point that moves so that the ratio of its distance from a fixed
point and from a fixed line is one. The fixed point, F , is called the focus and the fixed line,
D, the directrix. By definition, the distance from any point P on the parabola to the focus
is equal to its distance to the directrix. The ratio P F/P D is called the eccentricity e and
e = 1. The line F D through the focus perpendicular to the directrix is called the axis of the
parabola. The midpoint V of the segment F D, obviously a point on the locus, is called the
vertex of the parabola. The focal chord perpendicular to the axis is called the latus rectum.
135
136 Chapter 9 Parabolas
PHx, yL
axis
FHx1 , y1 L
D x
Moreover, it can be verified that B 2 − 4AC = 0. Therefore a necessary condition that the
equation Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0 represent a parabola is that B 2 − 4AC = 0.
The general equation of a parabola reveals that if the directrix line is parallel to one of the
coordinate axes then B = 0 since either A1 or B1 will be zero. The equation of a parabola in
this position will have no xy term.
which reduces to y 2 = 4f x. This is one of the standard forms of the equation of a parabola.
It has a vertex V (0, 0). If f is positive the parabola opens to the right; if f is negative it
opens to the left. The distance f is called the focal length of the parabola and is the distance
between the focus and the vertex of the parabola.
Generalizing the location of the vertex point to V (h, k) gives a parabola whose equation is
(y − k)2 = 4f (x − h).
This equation is the standard form used in Descarta2D as illustrated in the following example.
Example. Plot the parabola whose vertex is (2, 1), focal length is 1/2, and opens
to the right.
4
3
2
1
0
-1
-2
2 3 4 5 6 7 8
The axis of the parabola may also be parallel to the y-axis in which case the equation is
(x − h)2 = 4f (y − k).
Descarta2D does not directly use this form of the parabola, but instead simply rotates the y 2
form by the appropriate angle.
Example. Plot the parabola whose vertex is (1, −1), focal length is 1/3, and
opens upward.
138 Chapter 9 Parabolas
Solution. Use the same command as in the previous example with a rotation
angle of π/2 radians.
6
5
4
3
2
1
0
-1
-2-1 0 1 2 3 4
Example. Plot the four parabolas whose vertices are (1, 1), (−1, 1), (−1, −1) and
(1, −1), focal length 1/3, and axes aligned with the lines x − y = 0 and x + y = 0.
6
4
2
0
-2
-4
-6
-6-4-2 0 2 4 6
9.4 Reduction to Standard Form 139
In either case it is easy to reduce this general equation to the corresponding standard form
by the process of completing the square.
3π
Out[4] 9Parabola2DA8−2, 3<, 1, E=
2
The equation in standard form is (y − 3)2 = 4(x + 2), rotated 270◦ (3π/2 radians)
about the point (−2, 3).
In[5]: Sketch2D@8crv1<D;
3
2
1
0
-1
-2
-6 -4 -2 0 2
The following example shows how Descarta2D may be used to find the various geometric
objects associated with a parabola.
Example. Find the focus, directrix, vertex, axis and eccentricity of the parabola
represented by the equation x2 − 2x − 8y − 15 = 0. Plot the geometric objects.
140 Chapter 9 Parabolas
Solution. The function Foci2D[parabola] returns a list of one point which is the
focus of the parabola; Directrices2D[parabola] returns a list of one line which
is the directrix of the parabola; Line2D[parabola] returns the axis line of the
parabola; and the function Eccentricity2D[parabola] returns the eccentricity of
a parabola (always 1).
π
Out[6] Parabola2DA81, −2<, 2, E
2
In[7]: 8Eccentricity2D@p1D,
geom = Map@H#@p1DL&,
8Foci2D, Directrices2D, Vertices2D, Line2D<D< êê Flatten
Out[7] 81, Point2D@81, 0<D, Line2D@0, 1, 4D, Point2D@81, −2<D, Line2D@−1, 0, 1D<
0
-1
-2
-3
-4 -2 0 2 4
A2 x1 + B2 y1 + C2
d= p
A22 + B22
be the signed distance from the focus F to the directrix L, D = |d|, and F 0 be the projection
0
of F on L. p the coordinates of F are given by (x1 − ad, y1 − bd), where
p From a previous chapter
2 2 2 2
a = A2 / A2 + B2 and b = B2 / A2 + B2 . The vertex point V is obviously the midpoint of
the line segment F F 0 and has coordinates V (h, k) = (x1 − ad/2, y1 − bd/2). The focal length
f is half of D, f = D/2. The rotation angle θ is the angle of the line F F 0 .
9.6 Parametric Equations 141
Example. Determine the parabola in standard form defined by the focus point
F (1, 1) and the directrix line x + y = 0.
1 1 1 π
Out[9] Parabola2DA9 , =,
è!!! , E
2 2 2 4
(y − k)2 = 4f (x − h)
where (h, k) is the vertex of the parabola and f is the focal length. The axis of this parabola
is parallel to the x-axis and the parabola opens to the right (when f > 0). Parabolas in other
orientations are obtained by applying a rotation, θ, to the standard parabola. Since only the
y term is quadratic, it is easy to find one set of parametric equations for a parabola. Let
y = k + 2f t be one of the equations; then, solving for t yields
(y − k)
t= .
2f
Substituting this into the equation of the parabola and solving for x yields the two parametric
equations
x = h + f t2
y = k + 2f t.
The parameter value t = 0 produces the vertex point (h, k). Increasing values of t produce
points above and to the right of the vertex. Negative values of t produce points that correspond
to positive t values reflected in the axis of the parabola. Parameter values t = ±1 produce
the end points of the focal chord of the parabola.
142 Chapter 9 Parabolas
2 2
0 0
-2 -2
-4 -4
0 2 4 6 8 10 0 2 4 6 8 10
9.7 Explorations
Length of Parabola Focal Chord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbfocchd.nb
Prove that the length of the focal chord of a parabola is 4f , where f is the focal length.
—–
9.7 Explorations 143
(a2 + ab + b2 )2 a2 + ab + b2 ab
h= , k= and f = − .
4ab(a + b) 2(a + b) 4(a + b)
—–
Parabolic Arch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbarch.nb
y b
PJ ÄÄÄÄÄÄÄ , hN
2
b x
Find the equation of the parabolic arch of base b and height h as shown in the figure. Assume
that b and h are positive.
—–
Parabola Determinant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbdet.nb
Show that the determinant
x2 1
y x
y1 x21 x1 1
=0
x22 1
y2 x2
y3 x23 x3 1
—–
Circle Tangent to a Parabola. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbtancir.nb
Any line through the point (−3a, 0) cuts the parabola y 2 = 4ax in the points P and Q.
Prove that the circle through P , Q and the focus is tangent to the parabola.
—–
Polar Equation of a Parabola. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarpb.nb
Show that the polar equation of a parabola opening to the right with vertex at (0,0) is
given by
4f cos θ
r=
sin2 θ
where f is the focal length of the parabola.
—–
Chapter 10
Ellipses
The visible universe is filled with ellipses, or near ellipses, traced by celestial bodies revolving
around each other, such as planets and the sun. The fact that the angle formed by two focal
radii through a point on an ellipse is bisected by the normal to the curve may be used in a device
for re-concentrating sound waves, at illustrated in the acoustics of the Mormon Tabernacle
in Salt Lake City, Utah. Various types of rotating machinery use elliptical components to
generate special types of linear and rotational motions. This chapter develops the mathematics
of an ellipse.
10.1 Definitions
An ellipse is the locus of a point that moves so that the ratio of its distance from a fixed
point and from a fixed line is a positive constant less than one. As with the parabola, a focus,
directrix and eccentricity are associated with the curve as described in Table 10.1.
Consider the line through the focus perpendicular to the directrix. From the definition
P F/P D = e/1 there are obviously two points V and V 0 which divide the (undirected) segment
145
146 Chapter 10 Ellipses
PHx, yL
V¢
F¢ D¢
C
V F
x
F D, internally and externally respectively, into the ratio of e/1. Therefore V and V 0 are points
(on the same side of D) on the ellipse; they are called the vertices. The segment V V 0 is called
the major axis. By symmetry there is another point F 0 and another line D0 such that F 0 and
D0 would serve as the definition of this curve. Thus an ellipse has two foci and two directrices
associated in pairs F , D and F 0 , D0 . The midpoint of F F 0 , which is also the midpoint of V V 0 ,
is called the center C. It is evident that the locus is contained between the vertices, that it
is bounded in all directions and that it is symmetric both with respect to the major axis and
to a line perpendicular to it through C.
The focal chord perpendicular to the major axis is called the latus rectum. The length of
the central chord perpendicular to the major axis is called the minor axis.
Example. Plot the ellipse with center at coordinates (2, 1), major axis length of
6, minor axis length of 2, and rotated 30◦ (π/6 radians) about the center point.
2.5
2
1.5
1
0.5
0
-0.5
0 1 2 3 4
y a
D
V C V
F F
b
D
y D
V b
a
F
F D
x-axis y-axis
2 2 2
(x − h) (y − k) (x − h) (y − k)2
Equation + =1 + =1
a2 b2 b 2 a2
Center C(h, k) C(h, k)
Semi-major axis a a
Semi-minor axis b b
Vertices V (h ± a, k) V (h, k ± a)
Foci F (h ± ae, k) F (h, k ± ae)
Directrices x = h ± a/e y = k ± a/e
Focal chord length 2b2 /a 2b2 /a
√ √
a2 − b 2 a2 − b 2
Eccentricity e= <1 e= <1
a a
where a and b are the lengths of the semi-major and semi-minor axes, respectively. If the
ellipse is centered at (h, k), then the equation is
(x − h)2 (y − k)2
+ =1
a2 b2
as shown in Figure 10.2. When an ellipse is in this special position, the formulas for the
important points, lines and constants associated with the ellipse are simply determined and
are summarized in Table 10.2.
(x − h)2 (y − k)2
+ =1
b2 a2
as shown in Figure 10.3. When an ellipse is in this special position, the formulas for the
important points, lines and constants associated with the ellipse are simply determined and
are summarized in Table 10.2.
150 Chapter 10 Ellipses
Ax2 + Cy 2 + Dx + Ey + F = 0, AC > 0.
The condition B 2 − 4AC < 0 reduces to AC > 0 which implies that A and C are of like sign.
This equation can be reduced to one of the standard forms by completing the square.
(x + 2)2 y2
The equation in standard form is + = 1.
4 1
In[3]: Sketch2D@8crv1<D;
1
0.5
0
-0.5
-1
-4 -3 -2 -1 0
è!!!
Out[4] 9Ellipse2DA81, 3<, 3, 5 , 0E=
(x − 1)2 (y − 3)2
The standard form of the equation is + = 1.
9 5
In[5]: objs = Map@H#@ crv1@@1DD DL&,
8Point2D, Foci2D, Vertices2D, Directrices2D,
SemiMajorAxis2D, SemiMinorAxis2D,
Eccentricity2D<D
6
5
4
3
2
1
0
-1
-4 -2 0 2 4 6
The length of the semi-major axis, a, is one-half the distance between the vertices, yielding
a = |V1 V2 |/2. The eccentricity is given by
√
a2 − b 2
e= ,
a
The line through the two vertex points determines the rotation angle of the ellipse as
θ = tan−1 (x2 − x1 , y2 − y1 ).
Example. Find the ellipse whose vertices are (4, 2) and (−2, 1), and whose eccen-
tricity is 7/8.
3
2.5
2
1.5
1
0.5
0
-2 -1 0 1 2 3 4
10.6 Ellipse from Foci and Eccentricity 153
Example. Find the ellipse whose foci are (−1, −1) and (1, 1) and whose eccen-
tricity is 1/2.
è!!! è!!! π
Out[9] Ellipse2DA80, 0<, 2 2 , 6 , E
4
1
Out[10] 98Point2D@81, 1<D, Point2D@8−1, −1<D<, =
2
It is clear from Table 10.2 that the distance from F to L is also given by d = a/e − ae. Solving
for a (the length of the semi-major axis) yields
e
a=d .
(1 − e2 )
Table 10.2 shows that the eccentricity, e, is related to the lengths of the semi-major and
semi-minor axes, a and b, respectively, by
√
a2 − b 2
e= .
a
Solving this equation for b yields p
b = a 1 − e2 .
Table 10.2 reveals that the distance from the focus F to the center C(h, k) is given by ae. If F 0
is the projection of F onto L, then we can find the center point C of the ellipse by offsetting F
in the direction from F to F 0 a distance −ae. This computation is easily accomplished using
Descarta2D and is provided in the exploration ellfd.nb. The resulting defining constants of
the ellipse are given by
paeD qaeD
h = x1 + , k = y1 + ,
d d
e p
a=d , b = a 1 − e2 ,
(1 − e2 )
where s
(px1 + qy1 + r)2 px1 + qy1 + r
d= and D = .
p2 + q 2 p2 + q 2
Example. Find the ellipse whose focus point is (3, 2), directrix line x − y + 2 = 0
and eccentricity is 1/4.
è!!!
31 19 2 2 3 3π
Out[11] Ellipse2DA9 , =, , $%%%%%%%
% , E
10 10 5 10 4
In[12]: 8Foci2D@e1D,
Directrices2D@e1D,
Eccentricity2D@e1D< êê Simplify
16 9
Out[12] 99Point2D@83, 2<D, Point2DA9 , =E=,
5 5
1
8Line2D@−1, 1, −2D, Line2D@−5, 5, 22D<, =
4
10.8 Parametric Equations 155
(x − h)2 (y − k)2
+ =1
a2 b2
are very similar to those of a circle, with the exception that the radius is replaced by either
the length of the semi-major axis, a, or the semi-minor axis, b. The appropriate equations are
where (h, k) is the center of the ellipse, a and b are the lengths of the semi-major and semi-
minor axes, respectively, and parameter values in the range 0 ≤ t < 2π generate a complete
curve. The validity of these equations can be verified by direct substitution.
x2 y2
+ =1
16 4
at equally spaced parameter values.
2
1
0
-1
-2
-4 -2 0 2 4
As with the circle, a pair of rational equations may be used as the parametric equations
for an ellipse. The ellipse
x2 y2
+ =1
a2 b2
156 Chapter 10 Ellipses
Values of t in the range 0 ≤ t ≤ 1 generate coordinates on the ellipse in the first quadrant.
The point (−a, 0), which is on the ellipse, cannot be generated using these equations.
In[14]: Clear@tD;
ParametricPlot@82 ∗ H1 − t ^ 2L ê H1 + t ^ 2L, 2 ∗ 1 ∗ t ê H1 + t ^ 2L<,
8t, −10, 10<, AspectRatio −> AutomaticD;
0.5
-2 -1 1 2
-0.5
-1
10.9 Explorations
Length of Ellipse Focal Chord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elllen.nb
Prove that the length of the focal chord of an ellipse is 2b2 /a, where a is the length of the
semi-major axis and b is the length of the semi-minor axis.
—–
Sum of Focal Distances of an Ellipse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ellips2a.nb
Show that the sum of the distances from the two foci to any point on an ellipse is 2a, where
a is the length of the semi-major axis.
—–
10.9 Explorations 157
—–
Focus of Ellipse is Pole of Directrix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elfocdir.nb
Show that the focus of an ellipse is the pole of the corresponding directrix.
—–
Ellipse Locus, Distance from Two Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elldist.nb
A point moves so that the sum of the squares of its distances from two intersecting straight
lines is a constant. Prove that its locus is an ellipse.
—–
Similar Ellipses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ellsim.nb
All ellipses of equal eccentricity are essentially similar in that by a proper choice of scales
(and axes) they can be made to coincide. Show this property is true for two ellipses of equal
eccentricity centered at the origin.
—–
Polar Equation of an Ellipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarell.nb
Show that the polar equation of an ellipse with a horizontal major axis and centered at
(0, 0) is given by
ab
r= p
2
a sin θ + b2 cos2 θ
2
where a and b are the lengths of the semi-major and semi-minor axes, respectively.
—–
Apoapsis and Periapsis of an Ellipse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ellrad.nb
Show that the greatest (apoapsis) and least (periapsis) radial distance of a point on an
ellipse as measured from a focus point is given by r = a(1 + e) and r = a(1 − e), respectively,
where e is the eccentricity and a is the length of the semi-major axis of the ellipse.
—–
Chapter 11
Hyperbolas
The equations of a hyperbola are in many ways similar to those of an ellipse, the forms often
only differing by a + or − sign. The properties and characteristics of a hyperbola, however, are
somewhat less intuitive than an ellipse, possibly because the curve has two disjoint branches or
because it extends to infinity. This chapter describes the detailed mathematics of a hyperbola.
11.1 Definitions
A hyperbola is the locus of a point that moves so that the ratio of its distance from a fixed
point and from a fixed line is a constant greater than one. As with the parabola and ellipse,
a focus, directrix and eccentricity are associated with the curve as shown in Table 11.1.
Consider the line through the focus perpendicular to the directrix. From the definition
P F/P D = e/1 there are obviously two points V and V 0 which divide the (undirected) segment
F D, internally and externally respectively, in the ratio of e/1. Therefore, V and V 0 are points
(on opposite sides of D) on the hyperbola; they are called the vertices. The segment V V 0 is
called the transverse axis. By symmetry, there is another point F 0 and another line D0 such
159
160 Chapter 11 Hyperbolas
y PHx, yL
F¢
C V¢
V x
F
D¢
that F 0 and D0 would serve in the definition of this curve. Thus, a hyperbola has two foci
and two directrices associated in pairs F , D and F 0 , D0 . The midpoint of F F 0 , which is also
the midpoint of V V 0 , is called the center C. There are two tangent lines through C whose
points of contact are at an infinite distance from C. These are called the asymptotes of the
hyperbola. The focal chord perpendicular to the transverse axis is called the latus rectum.
A line through C perpendicular to the transverse axis does not intersect the hyperbola
in real points. But the portion of it, bisected by C, which is equal in length to the parallel
segment through V contained between the asymptotes is called the conjugate axis.
Example. Plot the hyperbola with center at coordinates (2, 1), transverse axis
length of 1, conjugate axis length of 3/4 and rotated 30◦ (π/6 radians) about the
center point.
4
3
2
1
0
-1
-2
-4 -2 0 2 4 6 8
y
D D
V V
F C F
C V
F
x
x-axis y-axis
2 2 2
(x − h) (y − k) (x − h) (y − k)2
Equation − =1 − + =1
a2 b2 b 2 a2
Center C(h, k) C(h, k)
Semi-transverse axis a a
Semi-conjugate axis b b
Vertices V (h ± a, k) V (h, k ± a)
Foci F (h ± ae, k) F (h, k ± ae)
Directrices x = h ± a/e y = k ± a/e
Asymptotes bx ± ay − (bh ± ak) = 0 ax ± by − (ah ± bk) = 0
Focal chord length 2b2 /a 2b2 /a
√ √
a2 + b 2 a2 + b 2
Eccentricity e= >1 e= >1
a a
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively. If
the hyperbola is centered at (h, k), then the equation is
(x − h)2 (y − k)2
2
− =1
a b2
as shown in Figure 11.2. When a hyperbola is in this special position, the formulas for the
important points, lines and constants associated with the hyperbola are simply determined
and are summarized in Table 11.2.
The lengths of the transverse axis, conjugate axis, focal chord and the value of the eccen-
tricity are independent of the origin and are also given in Table 11.2. Note that the equations
of the asymptotes can be obtained directly from the equation of the hyperbola in standard
form by replacing the one on the right-hand side of the equation with a zero. The left-hand
side of the equation will then factor into two linear terms which are the asymptotes of the
hyperbola.
x2 y2
− + =1
b2 a2
164 Chapter 11 Hyperbolas
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively. If
the hyperbola is centered at (h, k), then the equation is
(x − h)2 (y − k)2
− + =1
b2 a2
as shown in Figure 11.3. When a hyperbola is in this special position, the formulas for the
important points, lines and constants associated with the hyperbola are simply determined
and are summarized in Table 11.2
The lengths of the semi-transverse axis, semi-conjugate axis, focal chord and the value
of the eccentricity are independent of the origin and are also shown in Table 11.2. These
constants have the same values as a hyperbola whose transverse axis is parallel to the x-axis.
Example. Write the equation of the hyperbola whose center is (−2, 1), transverse
axis length 6 (parallel to the x-axis), and conjugate axis length 8. Determine its
eccentricity, foci and vertices. Find the equations of its directrices and asymptotes.
Plot the geometric objects.
Solution. The equation can be written directly using the standard form as
(x + 2)2 (y − 1)2
− = 1.
9 16
In Descarta2D this hyperbola is written as Hyperbola2D[{-2, 1}, 3, 4, 0].
11.3 Standard Forms of a Hyperbola 165
In[3]: Eccentricity2D@h1D
5
Out[3]
3
The Descarta2D function Foci2D[hyperbola] returns a list of the two focus points;
the function Vertices2D[hyperbola] returns a list of the two vertex points; the
function Directrices2D[hyperbola] returns a list of the two directrix lines; the
function Asymptotes2D[hyperbola] returns a list of the two asymptote lines.
10
7.5
5
2.5
0
-2.5
-5
-7.5
-10 -5 0 5 10
Example. Plot the hyperbola whose equation is 4x2 − y 2 + 36 = 0 along with its
conjugate.
π
Out[6] 9Hyperbola2DA80, 0<, 6, 3, E=
2
Out[8] True
The statement IsOn2D[f2b, c1], by returning True, shows that the foci of both
hyperbolas are on a common circle.
In[9]: Sketch2D@8h1, h2, f, c1<,
CurveLength2D −> 40,
PlotRange −> 88−12, 12<, 8−10, 10<<D;
10
7.5
5
2.5
0
-2.5
-5
-7.5
-10
-10 -5 0 5 10
A rectangular (or equilateral ) hyperbola is one in which the transverse and conjugate axes
are equal in length, in which case the asymptotes are at right angles to each other.
1 1 1 π
Out[10] 9Hyperbola2DA91, − =, , , E=
2 2 2 2
(x − 1)2 (y + 12 )2
− 1 + 1 = 1.
4 4
In[11]: Sketch2D@8h1<D;
4
3
2
1
0
-1
-2
-3
-4
-2 -1 0 1 2 3 4 5
The length of the semi-transverse axis, a, is one-half the distance between the vertices, yielding
a = |V1 V2 |/2. The eccentricity is given by
√
a2 + b 2
e= ,
a
168 Chapter 11 Hyperbolas
The line through the two vertex points determines the rotation angle of the hyperbola as
θ = tan−1 (x2 − x1 , y2 − y1 ).
Example. Find the hyperbola whose vertices are (4, 2) and (−2, 1), and whose
eccentricity is 3/2.
6
4
2
0
-2
-4
-4 -2 0 2 4 6
is the ratio of the distance between the foci to the distance between the vertices. This rela-
tionship allows us to construct a hyperbola by specifying the two foci and the eccentricity.
The semi-transverse
√ axis length, a, is given by a = |F1 F2 |/2e and the semi-conjugate axis
length is b = a e2 − 1. The center point of the hyperbola is clearly the midpoint of the two
foci and the angle of rotation is arctan(x2 − x1 , y2 − y1 ), where F1 (x1 , y1 ) and F2 (x2 , y2 ) are
the coordinates of the foci.
Example. Find the hyperbola whose foci are (−1, −1) and (1, 1) and whose
eccentricity is 3/2.
è!!! è!!!!!
2 2 10 π
Out[14] Hyperbola2DA80, 0<, , , E
3 3 4
3
Out[15] 98Point2D@81, 1<D, Point2D@8−1, −1<D<, =
2
It is clear from Table 11.2 that the distance from F to L is also given by d = ae − a/e. Solving
for a (the length of the semi-transverse axis) yields
e
a=d .
(e2 − 1)
Table 11.2 shows that the eccentricity, e, is related to the lengths of the semi-transverse and
semi-conjugate axes, a and b, respectively, by
√
a2 + b 2
e= .
a
170 Chapter 11 Hyperbolas
Example. Find the hyperbola whose focus is (3, 2), directrix line is x − y + 2 = 0
and eccentricity is 5.
è!!!
23 57 5 5 3 3π
Out[16] Hyperbola2DA9 , =,
è!!! , , E
16 16 8 2 4 4
In[17]: 8Foci2D@h1D,
Directrices2D@h1D,
Eccentricity2D@h1D< êê Simplify
1 41
Out[17] 99Point2DA9− , =E, Point2D@83, 2<D=,
8 8
8Line2D@−4, 4, −9D, Line2D@−1, 1, −2D<, 5=
(x − h)2 (y − k)2
− =1
a2 b2
11.8 Parametric Equations 171
where (h, k) is the center of the hyperbola, and a and b are the lengths of the semi-transverse
and semi-conjugate axes, respectively. The axis of this hyperbola is parallel to the x-axis and
the hyperbola opens to the right and left. Hyperbolas in other orientations are obtained by
applying a rotation, θ, to the standard hyperbola. The parametric equations for a hyperbola
are similar to those of an ellipse, except hyperbolic functions are used instead of standard
trigonometric functions. The parametric equations are
The parameter value t = 0 produces the vertex point on the right branch of the hyperbola.
Increasing values of t produce points above and to the right of this vertex. Negative values
of t produce points that correspond to positive t values reflected in the transverse axis of the
hyperbola. All of the points on the right branch need to be reflected in the conjugate axis of
the hyperbola to produce the left branch of the curve.
In Descarta2D the parametric equations of a hyperbola are scaled by a factor s so that
the end points of the focal chord are at the parameter values −1 and +1. Specifically, the
equations used in Descarta2D are
where
s = cosh−1 e
and e is the eccentricity of the hyperbola. The validity of these equations can be verified by
direct substitution.
Example. Plot eight points at equal parameter values on the upper and lower
portions of the right branch of the hyperbola x2 /4 − y 2 /2 = 1.
4 4
2 2
0 0
-2 -2
-4 -4
-4 -2 0 2 4 6 8 10 -4 -2 0 2 4 6 8 10
As with the ellipse, a pair of rational equations may be used as the parametric equations
for a hyperbola. The hyperbola
x2 y2
2
− 2 =1
a b
has the parametric equations
1 + t2 2t
x=a and y = b .
1 − t2 1 − t2
Values of t in the range 0 ≤ t < 1 generate coordinates on the hyperbola in the first quadrant.
The other portions of the curve can be generated by reflecting the coordinates generated by
these equations.
1
0.5
11.9 Explorations
Length of Hyperbola Focal Chord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hyplen.nb
Prove that the length of the focal chord of a hyperbola is 2b2 /a, where a is the length of
the semi-transverse axis and b is the length of the semi-conjugate axis.
—–
Focal Distances of a Hyperbola.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .hyp2a.nb
Show that the difference of the distances from the two foci to any point on a hyperbola is
2a, where a is the length of the semi-transverse axis.
—–
Hyperbola from Focus and Directrix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hypfd.nb
Show that the hyperbola with focus F (x1 , y1 ), directrix L ≡ px + qy + r = 0 and eccentric-
ity, e > 1 is defined by the constants
paeD qaeD
h = x1 − , k = y1 − ,
d d
e p
a=d , b = a e2 − 1, θ = tan−1 (p, q),
(e2 − 1)
where s
(px1 + qy1 + r)2 px1 + qy1 + r
d= and D = .
p2 + q 2 p2 + q 2
—–
Rectangular Hyperbola Distances. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hypinv.nb
Show that the distance of any point on a rectangular hyperbola from its center varies
inversely as the perpendicular distance from its polar to the center.
—–
Eccentricities of Conjugate Hyperbolas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hypeccen.nb
Show that if e1 and e2 are the eccentricities of a hyperbola and its conjugate, then
1/(e21 ) + 1/(e22 ) = 1.
—–
Polar Equation of a Hyperbola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarhyp.nb
Show that the polar equation of a hyperbola with a horizontal transverse axis and centered
at (0, 0) is given by
ab
r= p
b cos θ − a2 sin2 θ
2 2
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively.
—–
Trigonometric Parametric Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hyptrig.nb
Show that the parametric equations
—–
Chapter 12
General Conics
In previous chapters we have examined specific forms of an equation of the second degree
resulting in a detailed understanding of circles, parabolas, ellipses and hyperbolas. In this
chapter we will study the general second-degree equation itself resulting in a more complete
understanding of the equation.
• If the quadratic equation is one of several special forms, then the standard form of the
curve can be determined by inspection. The following curves have a quadratic form that
can be directly recognized: (1) a single point, (2) a single line, (3) two lines (parallel, co-
incident or intersecting), (4) a circle, parabola, ellipse or hyperbola in standard position
and (5) several forms with no real locus (imaginary).
• If the quadratic equation has first-degree terms (D 6= 0 or E 6= 0), translate the equation
to a coordinate system that eliminates the x or y terms. Once the curve is identified,
translate the standard curve back to the original position.
The following subsections describe each of these reduction steps in more detail.
175
176 Chapter 12 General Conics
Linear Polynomial
Form: Q ≡ Dx + Ey + F = 0, D and E not both zero.
If the first three coefficients of Q are equal to zero, and coefficients D and E are not both
zero, then the equation Q represents a single straight line Dx + Ey + F = 0.
Example. Show that Descarta2D will detect a quadratic equation as a line if the
first three coefficients are zero. Use the line x − 2y + 4 = 0 as an example.
If Q takes the form Ax2 + Dx + F = 0 and A 6= 0 then Q can be factored into two linear
terms using the quadratic formula. This yields the two equations
√
−D ± D2 − 4AF
x= .
2A
If the discriminant of this equation, d = D2 − 4AF , is less than zero, then there are no real
points in the locus represented by Q. Otherwise, Q represents a pair of vertical lines whose
equations are √ √
2Ax + (D + d) = 0 and 2Ax + (D − d) = 0.
The two lines are coincident if d = 0.
If Q takes the form Cy 2 + Ey + F = 0 and C 6= 0 then Q can be factored into two linear terms
using the quadratic formula. This yields the two equations
√
−E ± E 2 − 4CF
y= .
2C
If the discriminant of this equation, d = E 2 − 4CF , is less than zero, then there are no real
points in the locus represented by Q. Otherwise, Q represents a pair of horizontal lines whose
equations are √ √
2Cy + (E + d) = 0 and 2Cy + (E − d) = 0.
The two lines are coincident if d = 0.
If Q consists of x2 and y 2 terms only its locus is either a single point or a pair of intersecting
lines. If AC > 0 then the locus is the single point (0,0). If A < 0 and C > 0, then the
equation factors into the two linear terms
√ √ √ √
−Ax − Cy −Ax + Cy = 0.
If A > 0 and C < 0, then the equation factors into the two linear terms given by
√ √ √ √
Ax − −Cy Ax + −Cy = 0.
Both of these equations represent a pair of lines that intersect at the origin.
178 Chapter 12 General Conics
Circle
Form: Q ≡ Ax2 + Cy 2 + F = 0, A = C, A 6= 0, C 6= 0, F 6= 0.
When the coefficients of the x2 and y 2 terms of Q are equal and none of the coefficients A, C,
or F are equal to zero, the equation has no locus
√ if F > 0; otherwise, when F < 0, the locus
is a circle centered at the origin with radius −F .
When Q has a y 2 term and an x term, and the x2 and xy terms are missing, Q represents
a parabola whose axis is horizontal. The vertex, (h, k), and the focal length, f , may be
determined by completing the square and forming the equation
(y − k)2 = 4f (x − h)
where
E 2 − 4CF E D
h= , k=− and f = −
4CD 2C 4C
which is clearly a parabola. The parabola will open to the right if f is positive and it will
open to the left if f is negative.
12.1 Conic from Quadratic Equation 179
15
10
5
0
-5
-10
-15
0 5 10 15 20 25
When Q has an x2 term and a y term, and the y 2 and xy terms are missing, Q represents a
parabola whose axis is vertical. The vertex, (h, k), and the focal length, f , may be determined
by completing the square and forming the equation
(x − h)2 = 4f (y − k)
where
D D2 − 4AF E
h=− , k= , and f = −
2A 4AE 4A
which is clearly a parabola. The parabola will open upward if f is positive and it will open
downward if f is negative.
180 Chapter 12 General Conics
9 1 3π
Out[8] 9Parabola2DA92, =, , E=
4 2 2
If Q has non-zero coefficients on the x2 , y 2 , and constant terms, A 6= C, and all the other
coefficients are zero, then Q can be written in the form
x2 y2
+ = 1.
− FA −F
C
This equation represents an ellipse, a hyperbola or no real locus depending of the values of
−F/A and −F/C. The real loci (ellipses and hyperbolas) are centered at the origin (0, 0) and
have sizes and orientations as shown in the following table:
Condition Locus a b θ
F
F
− A < 0 and − C < 0 no locus - - -
q q
− FA > 0 and − F C < 0 hyperbola −F F
0
q A q C
q C q A 2
− FA > − C
F
>0 ellipse −F −F 0
q A q C
−F F
C > −A > 0 ellipse − FA −CF π
2
Example. Find and plot the conic curve whose equation is −x2 − 4y 2 + 1 = 0.
1
Out[9] 9Ellipse2DA80, 0<, 1, , 0E=
2
In[10]: Sketch2D@crvD;
1
0.5
0
-0.5
-1
-2 -1 0 1 2
If both the x2 and y 2 terms are present in Q along with at least one of the x or y terms, then
Q can be simplified by introducing a change in variables. Specifically, if the substitutions
D E
x0 = x − and y 0 = y −
2A 2C
are made in Q a new equation
Q0 ≡ A0 x02 + C 0 y 02 + F 0 = 0
A0 = 4A2 C,
C0 = 4AC 2 and
F0 = −CD2 − AE 2 + 4ACF. (12.1)
Q0 is now in a form that can be recognized by inspection. The change in variables translates
the origin of the conic. To restore it to its original position we apply the inverse translation
to the standard form of the conic.
In[12]: Sketch2D@crvD;
3
2
1
0
-1
-2 0 2 4 6
All quadratic equations with a non-zero xy term coefficient are standard conics in a rotated
position. It can be shown that rotating such an equation by the angle θ, where
B
tan (2θ) = ,
C −A
will produce a new quadratic equation, Q0 , whose x0 y 0 coefficient B 0 will be zero (see explo-
ration elimxy1.nb).
The coefficient of the xy term can also be removed by making the substitutions
x0 = kx + y and y 0 = ky − x
where s 2
(C − A) C −A
k= + +1
B B
(see exploration elimxy2.nb). These substitutions are equivalent to a rotation θ where
1
tan θ =
k
and a scaling by the factor
1
s= √ .
1 + k2
12.1 Conic from Quadratic Equation 183
In[14]: Sketch2D@crvD;
8
6
4
2
0
-2
-4
-6 -4 -2 0 2 4 6 8
184 Chapter 12 General Conics
where the factor 2 is inserted in the xy, x and y terms. For this form of the equation we define
I = a + b,
J = ab + ac + bc − f 2 − g 2 − h2 ,
K = ab − h2
and
a h g
D= h b f .
g f c
Each of the four expressions is invariant under rotation of the coordinate axes; that is, they
are equal respectively to the corresponding expressions after a rotation is performed. The
invariants are useful in the classification of conics as shown in Table 12.1.
2cd − be 2ae − bd
h= and k = 2 .
b2 − 4ac b − 4ac
d2 = ±(λx + µy − ρ).
d1
e=
d2
or p
(x − x1 )2 + (y − y1 )2 = ±e(λx + µy − ρ).
186 Chapter 12 General Conics
This equation is of the form Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0 and is, therefore, a conic
curve of the second degree. The equation reveals that if the defining directrix line is parallel
to one of the coordinate axes, then B = 0, since either λ or µ will be zero and the equation
will have no xy term.
Example. Find the quadratic equation of the curve whose focus is the point (2, 1),
directrix is x − 3y + 3 = 0 and eccentricity is 2. Plot the conic curve.
3.5
3
2.5
2
1.5
1
0.5
0
-1 0 1 2 3 4 5
focus and represents a measure of the width of the parabola. The expression 2p is called
the parameter of the parabola. This definition can be generalized to the other conics: the
parameter of a conic is defined as the length of the chord perpendicular to the principal axis
through the focus. The length of this chord for each conic is shown in Table 12.2 and is quite
easy to determine from the standard form of each conic.
Consider the equation of an ellipse centered at the origin in standard position
x2 y2
+ = 1.
a2 b2
Transforming the origin to the vertex V (−a, 0) yields the equation
(x − a)2 y2
+ =1
a2 b2
which can be rearranged into y 2 = 2b2 x/a−b2 x2 /a2 , or, by using the semi-parameter p = b2 /a
of the ellipse, into
y 2 = 2px − (p/a)x2 .
The relation to the vertex equation of the parabola y 2 = 2px is obvious. The term (p/a)x2
is subtracted from the term 2px to obtain the ellipse. This explains the name ellipse: it is
derived from the Greek term elleipsis meaning a deficiency compared with a parabola.
Similarly, the equation of a hyperbola
x2 y2
2
− 2 =1
a b
referred to by its vertex can be shown to be
y 2 = 2px + (p/a)x2
where p = b2 /a is the semi-parameter of the hyperbola. Compared with the parabola y 2 = 2px,
there is a term (p/a)x2 in excess of the term 2px. This explains the name hyperbola from the
Greek hyperbole meaning the excess.
By introducing the eccentricity e of the conic, all of the vertex equations can be represented
by the common vertex equation
(y − k)2 = 2p(x − h) − (1 − e2 )(x − h)2
188 Chapter 12 General Conics
where (h, k) is the vertex point of the conic, 2p is the parameter of the conic and e is the
eccentricity. The vertex equation also includes the case of a circle by using e = 0 as the
eccentricity.
3 1 15 2 8
Out[18] 99Circle2DA9 , 0=, E=, 9Ellipse2DA9 , 0=, ,
è!!! , 0E=,
2 2 7 7 7
1 3 2 1
9Parabola2DA81, 0<, , 0E=, 9Hyperbola2DA9 , 0=, ,
è!!! , 0E==
4 5 5 5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
1 2 3 4 5
which is easy to solve using the quadratic formula. Once the two values for x are known, the
corresponding values for y can be determined using the parametric equations of the line. So,
in the general case, a line and a conic will intersect in two points, the points being real and
distinct, real and coincident (the line being tangent to the conic) or imaginary (the line does
not intersect the conic).
Now consider the case of two intersecting conic curves whose equations are given by
a1 x2 + b1 xy + c1 y 2 + d1 x + e1 y + f1 = 0
2 2
a2 x + b2 xy + c2 y + d2 x + e2 y + f2 = 0.
Depending on the values of the coefficients it may or may not be easy to express one of the
equations with a pair of parametric equations; therefore, we look for alternative techniques
for finding the points of intersection. The brute force approach to the problem is to simply
regard it as a problem of solving two non-linear equations in two unknowns. Mathematica
can solve such systems of equations both numerically and symbolically, and this is, in fact,
the method implemented in Descarta2D.
Alternatively, the method of pencils can be used. Suppose we have two curves f (x, y) and
g(x, y). For any given value of λ, we can form the equation f (x, y) + λ g(x, y) = 0 which
obviously passes through all the points of intersection of the original two curves. As λ varies,
an entire family of curves, called a pencil, will be produced. By selecting an appropriate value
for λ we can hope to produce an equation f (x, y) + λ g(x, y) = 0 that is particularly simple.
We can then intersect the simpler curve with one of the original curves. This approach works
well for conic curves because there always exists a value for λ such that f (x, y) + λ g(x, y) = 0
190 Chapter 12 General Conics
represents two straight lines. Intersecting these two lines with either of the original conics
produces the four intersection points (which may be real and distinct, real and coincident
or imaginary). So there may be up to four points of intersection between two conic curves.
Since there exist three pairs of lines passing through four points, there are three values for λ
that represent two lines in the equation of the pencil. Finding the three values for λ involves
solving a cubic equation, which appears to be easier than solving two non-linear equations
in two unknowns. (Since solving two non-linear equations in two unknowns is equivalent to
solving a fourth-degree equation, and solving a fourth-degree equation reduces to solving a
cubic equation, the two techniques are mathematically similar in complexity.)
Example. Find the points of intersection of the line x − 2y + 2 = 0 with (a) the
circle x2 + y 2 = 4 and (b) the ellipse x2 /9 + y 2 = 1.
3
2
1
0
-1
-2
-4 -2 0 2 4
12.7 Explorations
Eliminate Cross-Term by Rotation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .elimxy1.nb
Show that rotating a quadratic ax2 + bxy + cy 2 + dx + ey + f = 0 through an angle θ given
by
b
tan(2θ) =
c−a
12.7 Explorations 191
to the equation ax2 + bxy + cy 2 + dx + ey + f = 0 will cause the xy term to vanish and a new
quadratic with the following coefficients will be formed:
a0 = ak 2 − bk + c,
b0 = 0,
c0 = ck 2 + bk + a,
d0 = dk − e,
e0 = ek + d and
f0 = f.
—–
Eliminate Cross-Term by Change in Variables. . . . . . . . . . . . . . . . . . . . . . . . . . elimxy3.nb
Show that applying the change in variables x0 = kx + y and y 0 = ky − x, where
s 2
(c − a) c−a
k= + + 1,
b b
1
s= √ .
1 + k2
—–
Eliminate Linear Terms.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .elimlin.nb
Show that applying the change in variables
d e
x0 = x − and y 0 = y −
2a 2c
192 Chapter 12 General Conics
—–
Polar Equation of a Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . polarcon.nb
y D P
rq
F x
Let the focus F of a conic be at the pole of a polar coordinate system and the directrix D be
perpendicular to the polar axis at a distance ρ to the left of the pole as shown in the figure.
Show that the polar equation of the conic is
eρ
r=
1 − e cos θ
where e is the eccentricity of the conic.
—–
Parameterization of a Quadratic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pquad.nb
Show that the quadratic Q ≡ ax2 + bxy + cy 2 + dx + ey = 0, that passes through the origin,
can be parameterized by the equations
d + et t(d + et)
x(t) = − and y(t) = −
a + t(b + ct) a + t(b + ct)
where −∞ < t < +∞.
—–
Chapter 13
Conic Arcs
In previous chapters we introduced line segments and circular arcs which are pieces of more
complete curves. In this chapter we introduce a conic arc which is a piece of a conic curve.
As with circular arcs, conic arcs are useful for constructing smoothly connected sequences of
curves as well as pleasing aesthetic shapes.
PA
h
r = ÄÄÄÄÄÄÄ
k k
h
P0 P1
193
194 Chapter 13 Conic Arcs
Example. Plot the conic arc with start and end points (−2, 1) and (3, 0), respec-
tively, apex point (1, 2) and projective discriminant ρ = 0.45.
where (x0 , y0 ) and (x1 , y1 ) are the coordinates of the start and end points, respec-
tively, (xA , yA ) is the apex point and ρ is the projective discriminant.
2
1.5
1
0.5
0
-0.5
-1
-2 -1 0 1 2 3 4
There are several functions provided by Descarta2D to query conic arcs. The func-
tion Rho2D[cnarc] returns the ρ value of the conic arc. Point2D[cnarc, Apex2D]
returns the apex control point of a conic arc. The coordinates of points on a conic
arc at a parameter value t are returned by the function cnarc[t], t = 0 returns the
start point coordinates, t = 1 the end point coordinates and t = 1/2 the shoulder
point coordinates.
In[2]: 8Rho2D@c1D,
Point2D@c1, Apex2DD,
Map@c1@#D&, 80, 1 ê 2, 1<D<
Out[2] 80.45, Point2D@81, 2<D, 88−2., 1.<, 80.725, 1.175<, 83., 0<<<
Example. Find the quadratic associated with the conic arc with start and end
points (0, 0) and (3, 0), respectively, apex point (1, 2) and projective discriminant
ρ = 1/4. Find the conic curve associated with the conic arc.
1 1
0.5 0.5
0 0
-0.5 -0.5
-1 -1
-1.5 -1.5
-2 -2
0 1 2 3 4 0 1 2 3 4
196 Chapter 13 Conic Arcs
0 < ρ < 1.
Consider the conic arc, S, with start and end points (0, 0) and (1, 0), respectively, apex
point PA (xA , yA ) and projective discriminant ρ. Clearly, any arbitrary conic arc can be
transformed to coincide with S by applying a proper sequence of translations, rotations and
scaling transformations. Such transformations do not change the type of conic curve associated
with the conic arc. Using Mathematica we can find the quadratic equation underlying S as
shown by the following commands.
In[5]: Clear@xA, yA, pD;
S = ConicArc2D@80, 0<, 8xA, yA<, 81, 0<, pD;
Q = Quadratic2D@SD êê Simplify
As has already been shown in a previous chapter, the specific conic type of the quadratic
equation
ax2 + bxy + cy 2 + dx + ey + f = 0
is determined by the discriminant, D = b2 − 4ac. For an ellipse D < 0, for a parabola D = 0,
and for a hyperbola D > 0. For the quadratic, Q, representing the conic arc S defined above,
D = 16ρ2 (−1 + 2ρ)y12 . It is clear by inspection, that if 0 < ρ < 1/2 the conic is an ellipse; if
ρ = 1/2 the conic is a parabola; and for 1/2 < ρ < 1 the conic is a hyperbola.
αβ = k(1 − α − β)2
where,
(1 − ρ)2
k =
4ρ2
(y − yA )(x1 − xA ) − (x − xA )(y1 − yA )
α =
(y0 − yA )(x1 − xA ) − (x0 − xA )(y1 − yA )
(y − yA )(x0 − xA ) − (x − xA )(y0 − yA )
β = .
(y1 − yA )(x0 − xA ) − (x1 − xA )(y0 − yA )
Therefore, since we know its quadratic equation, all the geometric characteristics of the conic
curve associated with the conic arc can be expressed in terms of the defining elements of the
13.4 Conic Characteristics 197
conic arc, P0 (x0 , y0 ), PA (xA , yA ), P1 (x1 , y1 ) and ρ. Of particular interest is the formula for
the center of a central conic (circle, ellipse or hyperbola), since this formula is used in the next
section to convert a conic into a conic arc. The center point (H, K) is given by
−ρ2 xA + (ρ − 1)2 xM
H = (13.1)
1 − 2ρ
−ρ yA + (ρ − 1)2 yM
2
K =
1 − 2ρ
where PM (xM , yM ) is the midpoint of the conic arc’s chord and has coordinates
xM = (x0 + x1 )/2 and yM = (y0 + y1 )/2.
This formula is derived in the exploration cacenter.nb.
Example. Find the center of the conic arc with control points (0, 0), (2, 1) and
(3, 0) and ρ = 1/4.
23 1
Out[6] Point2DA9 , − =E
16 8
Let Q be a conic and L be a line that intersects Q in two distinct points. We wish to
determine the conic arc, S cut by L through Q. Clearly, the intersection points of the line L
with Q are the start and end points of S. Also, the line passing through the intersection points
is the polar (line) of the apex point, PA , of S. To complete the definition of the conic arc, we
need to determine ρ. If the conic is a parabola, then ρ = 1/2; otherwise, we can assume that
the conic is a central conic. Assume the center of the conic is (h, k). Then, using the formula
for the x-coordinate of the center of a conic arc given in Equation (13.1), we solve to find the
value of ρ to be
1
ρ= p
1 ± (h − xA )/(h − xM )
where PM (xM , yM ) is the midpoint of P0 P1 . We choose the plus sign in the denominator
because ρ has to be less than one and the radical produces a positive number. In certain
configurations, this formula will be indeterminate and we instead use the y-coordinate of the
center of the conic arc yielding
1
ρ= p
1 ± (k − yA )/(k − yM )
again choosing the plus sign in the denominator.
198 Chapter 13 Conic Arcs
Example. Find the conic arc cut by the line 2x − 4y = 0 through the ellipse
(x − 1)2 (y + 1)2
+ = 1.
9 4
Plot the original curves and the conic arc separately.
5 46 23 3
Out[7] ConicArc2DA8−2, −1<, 9−2, =, 9 , =, E
3 25 25 8
3 3
2 2
1 1
0 0
-1 -1
-2 -2
-3 -3
-4 -2 0 2 4 -4 -2 0 2 4
b0 = (1 − t)2
b1 = 2t(1 − t)
b2 = t2 .
It is clear from direct substitution that P0 is the point whose coordinates correspond to t = 0,
and P1 corresponds to t = 1. The point where the curve intersects the line through the
midpoint of P0 P1 and PA is called the shoulder point of the conic arc. The shoulder point
corresponds to the parameter value t = 1/2.
Example. Plot nine points at equal parameter values on the conic arc with (−2, 1)
and (1, 2) as start and end point, (0, 3) as the apex point and ρ = 0.45.
2.2
2
1.8
1.6
1.4
1.2
1
-2 -1.5 -1 -0.5 0 0.5 1
13.6 Explorations
Circular Conic Arc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cacircle.nb
Show that the conic arc with control points (0, 0), (a, b) and (2a, 0) will be a circular arc if
√
a(−a + a2 + b2 )
ρ= .
b2
—–
200 Chapter 13 Conic Arcs
—–
Tangent Line at Shoulder Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . catnln.nb
Let P be the point at parameter value t = 1/2 on a unit conic arc, C, whose control points
are P0 (0, 0), PA (a, b) and P1 (1, 0) and whose projective discriminant is ρ. Let L be the line
tangent to C at t. Show that L is parallel to the chord P0 P1 at a distance bρ from P0 P1 . The
point P is called the shoulder point of the conic arc.
—–
Coordinates of Shoulder Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . shoulder.nb
Show that the coordinates of the shoulder point of a conic arc with control points P0 (x0 , y0 ),
PA (xA , yA ) and P1 (x1 , y1 ) and projective discriminant ρ are given by
(xM + ρ(xA − xM ), yM + ρ(yA − yM ))
where PM (xM , yM ) is the midpoint of the conic arc’s chord and has coordinates
x0 + x1 y0 + y1
xM = and yM = .
2 2
—–
Shoulder Point on Median. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . camedian.nb
Let C be a conic arc with control points P0 (x0 , y0 ), PA (xA , yA ) and P1 (x1 , y1 ) and projective
discriminant ρ. Let P be the point on the median PA PM associated with vertex PA of triangle
P0 PA P1 such that |P PM |/|PA PM | = ρ (PM (xM , yM ) is the midpoint of P0 P1 ). Show that P
is coincident with the shoulder point of C, having coordinates
(xM + ρ(xA − xM ), yM + ρ(yA − yM )) .
—–
Parametric Equations of a Conic Arc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . caparam.nb
Show that the parametric equations of a unit conic arc represent the same implicit quadratic
equation as the one underlying the conic as derived from the control points P0 (0, 0), PA (a, b)
and P1 (1, 0) and ρ.
—–
Chapter 14
Medial Curves
A medial curve is the locus of points equidistant from two loci of points. In this chapter we
will derive the equations of medial curves that are equidistant from two points, a point and a
curve (line or circle) and two curves (lines or circles).
14.1 Point–Point
Consider two distinct points P1 (x1 , y1 ) and P2 (x2 , y2 ) and a point P (x, y). The distance, d1 ,
from P to P1 is given by p
d1 = (x − x1 )2 + (y − y1 )2 .
Likewise, the distance, d2 , from P to P2 is given by
p
d2 = (x − x2 )2 + (y − y2 )2 .
which is easily recognized in this form as the general equation of a line. The medial line is
the perpendicular bisector of the line segment joining P1 and P2 . The derivation is provided
in the exploration mdptpt.nb.
Example. Find the equation of the medial line determined by the two points
(1, 2) and (−1, −1). Plot the points and the medial line.
201
202 Chapter 14 Medial Curves
3
2
1
0
-1
-2
-4 -2 0 2 4
14.2 Point–Line
Consider the point P1 (x1 , y1 ) and the line L2 ≡ A2 x + B2 y + C2 = 0, where A22 + B22 = 1 (to
simplify the derivation, the coefficients of the line are normalized because distance is involved).
The distance, d1 , from a point P (x, y) to P1 is given by
p
d1 = (x − x1 )2 + (y − y1 )2 .
d2 = ±(A2 x + B2 y + C2 ).
Since P is the locus of points on the medial curve, d1 = d2 , and by squaring and rearranging
we obtain the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0.
14.2 Point–Line 203
where
A = B22 ,
B = −2A2 B2 ,
C = A22 ,
D = −2(x1 + A2 C2 ),
E = −2(y1 + B2 C2 ) and
F = x21 + y12 − C22 .
Example. Find the medial curve of the point (−1, −1) and −x − y + 1 = 0 and
plot.
1 1 3 5π
Out[3] 9Parabola2DA9− , − =,
è!!! , E=
4 4 2 2 4
-2
-4
-4 -2 0 2 4
If the point P1 is on line L2 , then the medial curve will be a line perpendicular to the defining
line.
204 Chapter 14 Medial Curves
Example. Find the medial curve of the point (1, 0) and the line −x − y + 1 = 0
and plot. Notice that the point is on the line.
-2
-4
-3-2-1 0 1 2 3 4
14.3 Point–Circle
Consider a point P1 (x1 , y1 ) and a circle C2 with center (h2 , k2 ) and radius r2 . The distance,
d1 , from a point P (x, y) to P1 is given by
p
d1 = (x − x1 )2 + (y − y1 )2 .
If P is the locus of points equidistant from P1 and C2 , then d1 = d2 . Squaring both sides
of this equation eliminates the distinction between points P inside the circle and outside the
circle. Rearranging the resulting equation yields the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = 4((x1 − h2 )2 − r22 ),
B = 8(x1 − h2 )(y1 − k2 ),
C = 4((y1 − k2 )2 − r22 ),
D = 4(R(x1 − h2 ) + 2r22 x1 ),
E = 4(R(y1 − k2 ) + 2r22 y1 ),
F = R2 − 4r22 (x21 + y12 ) and
R = (h22 + k22 ) − (x21 + y12 ) − r22 .
Example. Find the medial curves of four points (−8, 1), (−4, 1), (−2, 1) and (0, 1)
with the circle x2 + (y − 1)2 = 4. Plot each of the curves separately.
6
4 4
2 2
0 0
-2
-2
-4
-8 -6 -4 -2 0 2 4 -4 -2 0 2 4
4 4
2 2
0 0
-2 -2
-4 -2 0 2 4 -4 -2 0 2 4
14.4 Line–Line
The locus of points equidistant from two lines
L1 ≡ A1 x + B1 y + C1 = 0 and
L2 ≡ A2 x + B2 y + C2 = 0
are the two angle bisector lines. The equations of these two lines are
A1 x + B1 y + C1 A2 x + B2 y + C2
p =± p
2
A1 + B1 2 A22 + B22
4
2
0
-2
-4
-4 -2 0 2 4
14.5 Line–Circle
Consider a line L1 ≡ A1 x + B1 y + C1 = 0, where A21 + B12 = 1 (to simplify the derivation,
the coefficients of the line are normalized because distance is involved), and a circle C2 with
center at (h2 , k2 ) and radius r2 . The distance, d1 , from a point P (x, y) to line L1 is given by
d1 = ±(A1 x + B1 y + C1 ).
We introduce a sign constant, s, which takes on the values ±1, so that we can combine the
two equations for d2 yielding
p
d2 = s (x − h2 )2 + (y − k2 )2 − r2 .
208 Chapter 14 Medial Curves
If P is the locus of points equidistant from P1 and C2 , then d1 = d2 . Rearranging the resulting
equation yields the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = B12 ,
B = −2A1 B1 ,
C = A21 ,
D = −2(h2 + A1 (C1 + sr2 )),
E = −2(k2 + B1 (C1 + sr2 )) and
F = h22 + k22 − r22 − C1 (C1 + 2sr2 ).
This derivation is included in mdlncir.nb. If the line intersects the circle in two distinct
points, then the medial curves will be two parabolas, each passing through the points of
intersection of the line and the circle.
Example. Find the curves that are equidistant from the line y = 1 and the circle
x2 + (y − 1)2 = 4. Plot the curves.
π 3π
Out[11] 9Parabola2DA80, 0<, 1, E, Parabola2DA80, 2<, 1, E=
2 2
3
2
1
0
-1
-4 -2 0 2 4
14.5 Line–Circle 209
If the line is tangent to the circle then one of the medial curves will be a parabola, and
the other will be a line passing through the tangency point and the center point of the circle.
Strictly speaking, not all of the points on the line are equidistant from the line and the circle,
unless we consider the distance to be measured both from the closest point on the circle and
the farthest point on the circle.
Example. Find the curves that are equidistant from the line y = 3 and the circle
x2 + (y − 1)2 = 4 and plot. Notice that the line is tangent to the circle.
3π
Out[13] 9Line2D@2, 0, 0D, Parabola2DA80, 3<, 2, E=
2
5
4
3
2
1
0
-4 -2 0 2 4
If the line and the circle do not intersect, then the two medial curves will be parabolas.
Strictly speaking, only one of these parabolas is equidistant from the circle and the line, unless
we consider the distance to be measured both from the closest point on the circle and the
farthest point on the circle.
Example. Find the curves that are equidistant from the line y = 5 and the circle
x2 + (y − 1)2 = 4. Plot the curves.
3π 3π
Out[15] 9Parabola2DA80, 2<, 1, E, Parabola2DA80, 4<, 3, E=
2 2
5
4
3
2
1
0
-1
-4 -2 0 2 4
14.6 Circle–Circle
Consider two distinct circles
C1 ≡ (x − h1 )2 + (y − k1 )2 = r12 and C2 ≡ (x − h2 )2 + (y − k2 )2 = r22 .
Using the same distance equating techniques outlined in previous sections, and introducing a
sign constant s = ±1, we can obtain the quadratic equation of the curves equidistant from
the two circles
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = 4((h1 − h2 )2 − R),
B = 8(h1 − h2 )(k1 − k2 ),
C = 4((k1 − k2 )2 − R),
D = 4(h1 (−D1 + D2 + R) + h2 (D1 − D2 + R)),
E = 4(k1 (−D1 + D2 + R) + k2 (D1 − D2 + R)) and
F = (D1 − D2 )2 − 2(D1 + D2 )R + R2
and
R = (r1 − sr2 )2 ,
D1 = h21 + k12 ,
D2 = h22 + k22 and
s = ±1.
14.6 Circle–Circle 211
This derivation is included in the exploration mdcircir.nb. Table 14.1 summarizes the medial
curves associated with a pair of circles in several configurations taking into consideration
differing radii and equal radii. Strictly speaking, some of the branches of these curves are not
equidistant from the two circles, unless we consider the distance to be measured both from
the closest and the farthest point on the circles.
Example. Find and plot the curves equidistant from the two circles x2 + y 2 = 9
and x2 + (y − 2)2 = 4.
4
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
212 Chapter 14 Medial Curves
14.7 Explorations
Medial Curve, Point–Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mdptpt.nb
Show that the line 2(x2 − x1 )x + 2(y2 − y1 )y + (x21 + y12 ) − (x22 + y22 ) = 0 is equidistant from
the points P1 (x1 , y1 ) and P2 (x2 , y2 ).
—–
Medial Curve, Point–Line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mdptln.nb
Show that the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0.
where
A = B22 ,
B = −2A2 B2 ,
C = A22 ,
D = −2(x1 + A2 C2 ),
E = −2(y1 + B2 C2 ) and
F = x21 + y12 − C22
is equidistant from the point P1 (x1 , y1 ) and the line L ≡ A2 x + B2 y + C2 = 0, assuming that
L is normalized (A22 + B22 = 1).
—–
Medial Curve, Point–Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mdptcir.nb
Show that the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = 4((x1 − h2 )2 − r22 ),
B = 8(x1 − h2 )(y1 − k2 ),
C = 4((y1 − k2 )2 − r22 ),
D = 4(R(x1 − h2 ) + 2r22 x1 ),
E = 4(R(y1 − k2 ) + 2r22 y1 ),
F = R2 − 4r22 (x21 + y12 ) and
R = (h22 + k22 ) − (x21 + y12 ) − r22
14.7 Explorations 213
(x − h2 )2 + (y − k2 )2 = r22 .
—–
Medial Curve, Line–Line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mdlnln.nb
Show that the pair of lines whose equations are
A1 x + B1 y + C1 A2 x + B2 y + C2
p =± p 2
2
A1 + B1 2 A2 + B22
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = B12 ,
B = −2A1 B1 ,
C = A21 ,
D = −2(h2 + A1 (C1 + sr2 )),
E = −2(k2 + B1 (C1 + sr2 )),
F = h22 + k22 − r22 − C1 (C1 + 2sr2 ) and
s = ±1
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
214 Chapter 14 Medial Curves
where
A = 4((h1 − h2 )2 − R),
B = 8(h1 − h2 )(k1 − k2 ),
C = 4((k1 − k2 )2 − R),
D = 4(h1 (−D1 + D2 + R) + h2 (D1 − D2 + R)),
E = 4(k1 (−D1 + D2 + R) + k2 (D1 − D2 + R)) and
F = (D1 − D2 )2 − 2(D1 + D2 )R + R2
and
R = (r1 − sr2 )2 ,
D1 = h21 + k12 ,
D2 = h22 + k22 and
s = ±1
—–
Medial Curve Type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mdtype.nb
Show that the medial curve equidistant from a point and a circle is a hyperbola when
the point is outside the circle and it is an ellipse when the point is inside the circle. (Hint:
Examine the value of the discriminant B 2 − 4AC of the medial quadratic.)
—–
Part IV
Geometric Functions
Chapter 15
Transformations
A transformation is a mathematical operation that changes a function of variables, say f (x, y),
into a new function f 0 (x0 , y 0 ) where
x0 = f1 (x, y) and y 0 = f2 (x, y).
These equations are called the equations of the transformation. Transformations can often be
constructed so that f 0 is much simpler than f . In this chapter we will study four transforma-
tions that have useful geometric interpretations: translation, rotation, scaling and reflection.
15.1 Translations
A translation is a transformation that maps coordinates (x, y) into
(x + u, y + v).
When a translation is applied to a locus of points, the resulting locus has the same shape and
orientation as the original one, but its position with respect to the coordinate axes is offset by
distances u in the x-direction and v in the y-direction. The equations of the transformation
are
x0 = x + u and y 0 = y + v.
Example. Determine the coordinates of the point that results from translating
(3, 2) by u = −1 and v = −3.
Solution. The function Translate2D[{x, y}, {u, v}] translates a coordinate list
(x, y) by the specified offset (u, v), returning a new coordinate list. The function
Translate2D[point, {u, v}] performs the same translation and returns a trans-
lated point.
217
218 Chapter 15 Transformations
f (x, y) = Ax + By + C
is a linear equation in two variables, we can translate this by making the substitutions
x = x0 − u and y = y 0 − v. Mathematica provides powerful functions for performing these
transformations.
In[2]: Clear@x, y, u, v, a, b, cD;
a ∗ x + b ∗ y + c ê. 8x −> x − u, y −> y − v< êê Expand
Out[2] c − a u − b v + a x + b y
Ax + By − Au − Bv + C.
Out[3] f − d u + a u2 − e v + b u v + c v2 + d x − 2 a u x − b v x + a x2 + e y − b u y − 2 c v y + b x y + c y2
Collecting terms and writing in standard mathematical notation yields the translated qua-
dratic equation
A0 x2 + B 0 xy + C 0 y 2 + D0 x + E 0 y + F 0 = 0
where
A0 = A
0
B = B
C0 = C
D0 = D − 2Au − Bv
E0 = E − 2Cv − Bu
F0 = Au2 + Buv + Cv 2 − Du − Ev + F.
15.2 Rotations 219
Using these basic formulas for translations it is easy to translate other objects. The location
of curves, such as circles, ellipses and conic arcs, are defined by points and can be translated
by translating the points themselves. For example, Ellipse2D[{h, k}, a, b, θ] is translated
to Ellipse2D[{h + u, k + v}, a, b, θ].
(x − 1)2 (y + 3)2
+ =1
16 9
by the offsets u = 2 and v = −2. Plot both the original ellipse and the translated
ellipse.
0
-2
-4
-6
-8
-2 0 2 4 6
15.2 Rotations
A rotation by an angle θ about the origin is a transformation that maps coordinates (x, y)
into (x cos θ − y sin θ, y cos θ + x sin θ). The mapping is easily confirmed using trigonometry as
shown in Figure 15.1.
cos α = x/r
sin α = y/r
220 Chapter 15 Transformations
y P¢
r1 P
q
r
a
O A¢ A x
x0 = OA0
= r cos(α + θ)
= r(cos α cos θ − sin α sin θ)
= r((x/r) cos θ − (y/r) sin θ)
= x cos θ − y sin θ.
Similarly, it can be shown that y 0 = y cos θ + x sin θ.
In order to rotate about a point (h, k), we first translate the coordinates to the origin,
perform the rotation using the equations above, then apply the inverse translation to restore
the object to its original position with the rotation applied. The general equations of a rotation
so derived are
x0 = h + (x − h) cos θ − (y − k) sin θ
y0 = k + (x − h) sin θ + (y − k) cos θ.
In order to rotate a linear equation Ax + By + C = 0 we need to solve these equations for
x and y so that we can substitute these values into the equation. Solving for x and y in terms
of x0 and y 0 (and making use of the identity sin2 θ + cos2 θ = 1) yields the equations
x = h + (x0 − h) cos θ + (y 0 − k) sin θ
y = k − (x0 − h) sin θ + (y 0 − k) cos θ.
Substituting into Ax + By + C yields the equation
A0 x + B 0 x + C 0 = 0
where
A0 = A cos θ − B sin θ
15.2 Rotations 221
B0 = B cos θ + A sin θ
C0 = Ah + Bk + C − (Ah + Bk) cos θ − (Ak − Bh) sin θ.
Q0 ≡ A0 x2 + B 0 xy + C 0 y 2 + D0 x + E 0 y + F 0 = 0,
By applying the formulas for rotating coordinates, linear equations and quadratic equa-
tions, we can now specify how to rotate all of the Descarta2D objects. Points and lines can be
rotated by directly applying the formulas for coordinates and linear equations, respectively.
Curves that are located by points can be rotated by rotating the defining points; addition-
ally, curves that have orientation angles, such as arcs, parabolas, ellipses and hyperbolas, are
rotated by adding the rotation angle, θ, to the angle of the curve.
4
3
2
1
0
-1
-2
-2 -1 0 1 2 3 4 5
15.3 Scaling
A scaling transformation maps coordinates (x, y) to (x0 , y 0 ) using the transformation equations
The scale factor, s > 0, indicates the ratio of corresponding lengths of the scaled object with
respect to the original object. The point (h, k) is called the center of scaling. A point at the
center of scaling does not change coordinates during a scaling transformation.
Solving the scaling transformation equations for (x, y) in terms of (x0 , y 0 ) yields
(x0 − h) (y 0 − k)
x=h+ and y = k + .
s s
Substituting the coordinates (x, y) into the linear polynomial Ax + By + C yields the scaled
linear polynomial
Ax + By + Ah(s − 1) + Bk(s − 1) + sC.
Similarly, applying a scaling transformation to the quadratic polynomial
Ax2 + Bxy + Cy 2 + Dx + Ey + F
15.3 Scaling 223
yields
A0 x2 + B 0 xy + C 0 y 2 + D0 x + E 0 y + F 0 = 0
where
A0 = A/s2
B0 = B/s2
C0 = C/s2
0
D = (D + (1 − s)(2Ah + Bk))/s
E0 = (E + (1 − s)(Bh + 2Ck))/s
F0 = (1 − s)2 (Ah2 + Bhk + Ck 2 ) + (1 − s)(Dh + Ek) + F.
The scaling transformation may be applied to Descarta2D geometric objects by apply-
ing the coordinate scaling transformation to the positioning arguments and simultaneously
multiplying the length arguments by the scale factor.
Example. Scale the circle (x − 2)2 + (y − 1)2 = 1 by a factor of 3/2 about its
center point and the origin. Plot the three circles.
Solution. The function Scale2D[object, s, {h, k}] scales the object using scale
factor s about the center of scaling (h, k). Scale2D[object, s] scales the object
about the origin. The object may be a coordinate list, a geometric object or a list
of Descarta2D objects.
In[8]: c1 = Circle2D@82, 1<, 1D;
8c2 = Scale2D@c1, 3 ê 2, 82, 1<D, c3 = Scale2D@c1, 3 ê 2D<
3 3 3
Out[8] 9Circle2DA82, 1<, E, Circle2DA93, =, E=
2 2 2
3
2.5
2
1.5
1
0.5
0
-0.5
1 2 3 4
224 Chapter 15 Transformations
15.4 Reflections
A reflection transformation maps the coordinates (x, y) to coordinates that are the “mirror”
reflection of the coordinates with respect to a line that represents the position of the mirror.
Consider the point P1 (x1 , y1 ) and the reflection line L2 ≡ A2 x + B2 y + C2 = 0. The following
Descarta2D commands can be used to determine the coordinates of the reflection of point P1
in line L2 .
In standard mathematical notation the coordinates P2 (x2 , y2 ) of the reflected point are given
by the transformation equations
2A2 (A2 x1 + B2 y1 + C2 )
x2 = x1 −
A22 + B22
2B2 (A2 x1 + B2 y1 + C2 )
y2 = y1 − .
A22 + B22
where
A3 = A1 (B22 − A22 ) − 2B1 A2 B2
B3 = B1 (A22 − B22 ) − 2A1 A2 B2
C3 = C1 (A22 + B22 ) − 2C2 (A1 A2 + B1 B2 ).
Substituting the coordinates (x1 , y1 ) into a quadratic polynomial
Q ≡ Ax2 + Bxy + Cy 2 + Dx + Ey + F
yields a quadratic Q0 reflected in the line L2 ≡ A2 x + B2 y + C2 = 0 of the form
Q0 ≡ A0 x2 + B 0 xy + C 0 y 2 + D0 x + E 0 y + F 0
where
A0 = Af1 f2 + 2Bpf4 + 4Cp2
B0 = 4Apf4 + B(4p2 − f42 ) − 4Cpf4
0
C = 4Ap2 − 2Bpf4 + Cf1 f2
D0 = 4Aqf4 + 2Br(2A22 + f4 ) + 8CqB22 − Df4 f3 − 2Epf3
E0 = 8AA22 r + 2Bq(2B22 − f4 ) − 4Crf4 − 2Dpf3 + Ef3 f4
F0 = 4(Aq 2 + BpC22 + Cr2 ) − 2f3 (Dq + Er) + F f32
and
p = A2 B2 , q = A2 C2 , r = B2 C2 ,
f1 = (A2 + B2 )2 , f2 = (A2 − B2 )2 ,
f3 = (A22 + B22 ), f4 = (A22 − B22 ).
Reflection of an Angle
What angle does a reflected line make with the +x-axis? Let L be a line that makes an angle
θ with the +x-axis, LR be a reflection line that makes an angle α with the +x-axis, and L0
the reflection of L in LR as shown in Figure 15.2. We wish to determine the angle θ0 that
L0 makes with the +x-axis. Using the fact that supplementary angles sum to π and that the
interior angles of a triangle sum to π, the angle θ0 = 2α − θ. The relationship also holds true
when α = θ, in which case L and L0 do not intersect. By applying the methods for reflecting
coordinates, equations and angles we are able to reflects all of the geometric objects in the
Descarta2D system.
Example. Reflect the arc centered at (3, 2) with radius 1 and start and end angles
of π and 3π/2 in the line x + 3y + 2 = 0.
226 Chapter 15 Transformations
y LR
L
L¢
q¢ a q
g a p-a q x
b b b=a-q
g=p-H2a-qL
q=2a-q
4 17 è!!!
Out[12] Arc2DA82, −3<, 9− , − =, −1 + 2E
5 5
2
1
0
-1
-2
-3
-4 -2 0 2 4
15.5 Explorations
Reflection in a Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . reflctpt.nb
A point P 0 (x0 , y 0 ) is said to be the reflection of a point P (x, y) in the point C(H, K) if C
is the midpoint of the segment P P 0 . Using this definition show that
15.5 Explorations 227
Arc Length
Intuitively, arc length is a measure of distance along a curve. For a straight line the distance
is called the length and is easily computed using the distance formula. For some curves the
arc length has other special names such as the perimeter of a triangle or the circumference
of a circle. This chapter discusses methods for computing the arc lengths of simple geometric
curves, such as those provided in Descarta2D.
Example. Find the distance between the parameter values −2 and 1 on any line
(assuming the parameterizations defined in the Descarta2D packages).
Solution. The function ArcLength2D[line, {t1 , t2 }] returns the arc length be-
tween two parameter values on a line.
In[1]: Clear@a, b, cD;
ArcLength2D@Line2D@a, b, cD, 8−2, 1<D
Out[1] 3
229
230 Chapter 16 Arc Length
Example. Find the length of the line segment connecting the points (1, 3) and
(2, 4). Find the arc length on the line segment between the parameter values 1/4
and 1/2.
è!!! 1
Out[2] 9 2 ,
è!!! =
2 2
Example. Find the perimeter of a triangle whose vertices are (1, 2), (3, 4) and
(5, 6).
r
s
q
Circumference of a Circle
Consider the circle shown in Figure 16.1. The length, d, of the perpendicular segment from the
center of the circle to one of the sides of a regular, inscribed polygon is given by d = r sin 12 θ
where r is the radius of the circle and θ is angle between adjacent radii connecting the sides
of the polygon. The length of the sides of the polygon, s, is given by s = 2r cos 12 θ . Clearly,
the perimeter of the inscribed polygon, S, is given by S = ns, where n represents the number
of sides of the polygon. Now consider the ratio of the perimeter of polygons for two circles,
232 Chapter 16 Arc Length
S = πD = 2πr.
Out[4] 84 π, π<
Example. Find the arc length of the sector defined by the arc centered at (0, 0)
with radius 2 and start and end angles of π/4 and 3π/4.
16.5 Ellipses and Hyperbolas 233
Out[5] π
Example. For the arc defined in the previous example, find the arc length between
the parameter values 0.25 and 0.75.
Out[6] 1.5708
where x0 and y 0 are the derivatives of the parametric equations of the curve with respect to
t. For many curves this integral is difficult to evaluate in symbolic form, but by using the
numerical integration capabilities of Mathematica we can find an approximate arc length.
Even for the conic curves (except the parabola, which we will discuss subsequently) the
integral for arc length leads to elliptic integrals, a class of integrals that cannot be expressed in
closed form in terms of elementary functions. This does not mean that these integrals do not
exist, but require the definition of non-elementary functions. Fortunately, the elliptic integral
needed to evaluate the arc lengths of ellipses and hyperbolas is built-in to Mathematica as the
EllipticE[phi, m] function, which is written E(φ|m) in traditional mathematical notation.
The arc length, s, in the parameter range 0 ≤ t ≤ 2π, of an ellipse in terms of this elliptic
integral is given by
a2
s=bE t1− 2
b
234 Chapter 16 Arc Length
where a and b are the lengths of the semi-major and semi-minor axes, respectively, of the
ellipse. Since all elliptic arcs can be expressed as sums or differences of such arcs, the formula
serves to provide a means for expressing the arc length between any pair of parameters.
Similarly, the arc length, s, of a hyperbola, using the parametric equations for a hyperbola
defined in Descarta2D, can be expressed in terms of this elliptic integral and is given by
r ! !
a2 + b 2 a2
−1
s = i b E i cos t1+ 2
a b
Example. Find the approximate arc length of the ellipse x2 /9 + y 2/4 = 1 between
parameter values 0 and π/2.
Out[7] 3.96636
16.6 Parabolas
Consider a parabola represented by the parametric equations
x = f t2 and y = 2f t.
The arc length, s, of such a parabola between two parameters, t1 < t2 , can be derived in terms
of elementary functions. The derivation is provided in the exploration pbarclen.nb where
the arc length is shown to be s = f (S2 − S1 ) where
p
Sn = tn 1 + t2n + sinh−1 (tn ).
Example. Find the arc length of the parabola y 2 = 4x between parameter values
−2 and 3. Find the arc length cut off by the focal chord of the parabola.
16.7 Chord Parameters 235
Example. Find the arc length of the parabola with vertex at (0, 0), focal length
of 1 (opening upward) cut off by the line 2x + 4y − 5 = 0.
1 è!!! 1 è!!!
Out[9] 9 I1 − 6 M, I1 + 6 M=
2 2
1 "#########################
è!!!!! è!!! "###################
è!!! è!!! "###################
è!!!
Out[10] 202 + 10 97 − LogA1 − 6 + 11 − 2 6 E + LogA1 + 6 + 11 + 2 6 E
4
236 Chapter 16 Arc Length
16.9 Explorations
Arc Length of a Parabola. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbarclen.nb
Show that the arc length, s, of a parabola whose parametric equations are
x = f t2 and y = 2f t
is given by s = f (S2 − S1 ) where
p
S n = tn 1 + t2n + sinh−1 (tn ).
—–
Approximate Arc Length of a Curve. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . narclen.nb
The arc length of a smooth, parametrically defined curve can be approximated by a polygon
connecting a sequence of points on the curve. Write a Mathematica function of the form
NArcLength2D[crv, {t1 , t2 }, n] that approximates the arc length of a curve between two
parameter values using a specified number of coordinates at equal parameter intervals between
the two given parameters. Produce a graph illustrating the convergence of the approximation
to the Descarta2D function ArcLength2D[crv, {t1 , t2 }] //N.
—–
Arc Length of a Parabolic Conic Arc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . caarclen.nb
Using exact integration in Mathematica show that the arc length of a parabolic conic arc
with control points P0 (0, 0), PA (a, b), and P1 (1, 0) can be expressed exactly in symbolic form
in terms elementary functions of a and b.
—–
Chapter 17
Area
Intuitively, area is the measure of the number of unit squares that can be contained inside
a boundary. For a square with sides of length s, the area, A, is given by A = s2 . For a
rectangle with sides a and b, A = ab. As the boundary becomes more complex or contains
curved elements, the computation of the area requires more complex considerations. In this
chapter we will derive formulas for the areas of Descarta2D objects.
A D E A D A D
h h h
B b C B b1 b2 C E b1 B b C
b b2
237
238 Chapter 17 Area
F D a C E
A b1 a b2 B
b
or
b1 h b2 h
Area ABC = bh − − .
2 2
Simplifying and using b = b1 + b2 yields
bh
A= .
2
The same formula results for the area of an obtuse triangle (using b = b2 − b1 ), as shown on
the right in Figure 17.1.
Now consider the trapezoid ABCD shown in Figure 17.2. The area of ABCD is given by
or
hb1 hb2
Area ABCD = bh − − .
2 2
Simplifying and using b = a + b1 + b2 yields
(a + b)
A= h.
2
These formulas from planar geometry will be useful in upcoming sections for deriving the
formulas using analytic geometry.
Triangular Area
There are several formulas for the area, A, of a triangle that involve lengths associated with
the triangle. The simplest is the familiar A = bh/2, where b is the length of one of the sides
of the triangle (the base) and h is the height of the triangle (the distance from the base to the
opposite vertex).
17.1 Areas of Geometric Figures 239
y C
A¢ B¢ C¢ x
The formula of Heron gives the area of the triangle in terms of the lengths of its sides, sn ,
alone: p
A = s(s − s1 )(s − s2 )(s − s3 )
where s = (s1 + s2 + s3 )/2 is the semi-perimeter. This formula is derived in the exploration
heron.nb.
Since a triangle is represented in Descarta2D by the coordinates of the vertices, we wish to
derive a formula based on the coordinates. Consider the triangle ABC as shown in Figure 17.3,
where the coordinates are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ). Projecting A, B and C onto the
x-axis produces three points A0 (x1 , 0), B 0 (x2 , 0) and C 0 (x3 , 0). The area of triangle ABC is
given by
Area ABC = Area AA0 C 0 C − Area AA0 B 0 B − Area BB 0 C 0 C.
The height and base lengths of these trapezoids can be determined as the difference of the
coordinates of the points, yielding
where (x1 , y1 ), (x2 , y2 ) and (x3 , y3 ) are the coordinates of the vertices of the triangle. The
sign is selected to yield a positive area.
Alternately, if we multiply the length of the line segment joining two of the points, by the
length of the perpendicular line segment on that line from the third point, we have double the
area of the triangle determined by the three points.
240 Chapter 17 Area
Example. Find the area of a triangle whose vertices are (1, 2), (4, 4) and (5, 6).
Out[1] 2
Out[2] 4 π
17.3 Circular Areas 241
r
s
q
The area of an arc sector of radius r as shown in Figure 17.5 may be determined as the
ratio of the angular span of the arc to the span of a complete circle (2π radians) times the
area of the circle. Since the area of a complete circle is πr2 , the area of an arc sector is given
by
r2
A = (θ2 − θ1 ).
2
Example. Find the area of the sector defined by the arc centered at (0, 0) with
radius 2 and start and end angles of π/4 and 3π/4.
y y
r q r q
x x
Out[3] π
The area of an arc segment, which is the area bounded by the arc and the chord connecting
the end points of the arc as shown in Figure 17.5, is calculated as the difference of the areas
of the sector and the triangle whose vertices are the end points and the center. Since the area
of this triangle is A = 12 r2 sin θ, the formula for the area of the arc segment is
2 θ r2
A = πr − sin θ
2π 2
r2
= (θ − sin θ)
2
where θ = θ2 − θ1 is the span of the arc, and r is the radius of the arc.
Example. Find the area of the segment defined by the arc centered at (0, 0) with
radius 2 and start and end angles of π/4 and 3π/4.
Solution. The Descarta2D function Area2D[arc] returns the area of the segment
defined by an arc and its chord.
In[4]: Area2D@Arc2D@Point2D@80, 0<D, 2, 8Pi ê 4, 3 Pi ê 4<DD êê Simplify
Out[4] −2 + π
Notice that if the angle θ is greater than π radians, the formula is still valid because sin θ will
be negative and the area of the central triangle will be added to the sector area producing the
correct result.
p
Solving for y yields y = b 1 − x2 /a2 for the upper portion of the ellipse. The following steps
outline the integration process that is used to compute the area:
Z a
A = y dx
−a
Z a p
= b 1 − x2 /a2 dx
−a
πab
= .
2
Therefore, the area of the complete ellipse (both the upper and lower portions) is given by
A = πab
where a and b are the lengths of the semi-major and semi-minor axes, respectively, of the
ellipse.
x2 y2
Example. Calculate the area of the ellipse + = 1.
4 9
Out[5] 6 π
y y
r q r q
x x
The formula is valid for angles θ in the range 0 ≤ θ ≤ π. Since all segments can be computed
as sums or differences of such segments and simple triangles, the area of all ellipse segments
can be determined using this basic formula.
Example. Find the area of the ellipse segment from π/6 to π/3 radians for an
ellipse with semi-major axis length of 3 and semi-minor axis length of 1.
3 π
Out[6] − +
4 4
The area of an ellipse sector, as illustrated in Figure 17.6, can be found by adding the area
of the triangle formed by the sector sides and the chord of the sector. The area of the triangle
is given by
bh ab sin θ
A4 = =
2 2
and the resulting formula for the area of the sector is given by
ab
A= π − 2 sin−1 (cos θ) .
4
Example. Find the area of the ellipse sector from π/6 to π/3 radians for an ellipse
with semi-major axis length of 3 and semi-minor axis length of 1.
17.5 Hyperbolic Areas 245
y y
P2 P2
O x O x
P1 P1
π
Out[7]
4
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively,
s = cosh−1 (e), and e is the eccentricity of the hyperbola. The exploration areahyp.nb uses
calculus to derive the formula for the area of the segment, which is given by
ab
Asegment = (sinh(s(t2 − t1 )) − s(t2 − t1 )).
2
Interestingly, the area does not depend on the values of t1 and t2 directly, but only upon the
difference between the two parameters.
Since we know the coordinates of the vertex points of the triangle OP1 P2 we can compute
its area directly as
ab
A4 = sinh(s(t2 − t1 )).
2
246 Chapter 17 Area
The area of a hyperbolic sector is the difference between the area of the triangle OP1 P2
and the hyperbolic segment as illustrated in Figure 17.7. The area of the hyperbolic sector is
given by
Asector = A4 − Asegment
abs
= (t2 − t1 ).
2
y
P2
FH f , 0L x
P1
Performing the integration and making the substitutions y1 = 2f t1 and y2 = 2f t2 yields the
formula for the area, A, of a parabolic segment to be
f 2 (t2 − t1 )3
A=
3
where t1 and t2 are the parameters of the end points of the chord defining the segment, and
t1 < t2 for positive areas. A parabola has no sector area definition because a parabola does
not have a center point.
Example. Find the area between the parabola y 2 = x/2 rotated π/2 radians
about its vertex and its focal chord.
2
Out[9]
3
Descarta2D Hint. Notice that the parabola’s position and orientation have no
bearing on the area of a parabolic segment. The area depends solely on the focal
length and the chord position.
248 Chapter 17 Area
bd
A=
3
as shown in the exploration caarea2.nb.
This process can be generalized to find the segment area of any conic arc. Notice that the
position of the conic arc in the plane has no bearing on its chordal area. Therefore, we can
translate the start point to (0, 0) and rotate the conic so that the end point is on the x-axis.
Example. Find the area between the conic arc with start point (1, 2), end point
(5, 0), apex point (3, 4) and ρ = 0.75 and its chord.
Out[10] 5.34774
17.8 Summary of Area Functions 249
17.9 Explorations
Heron’s Formula. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .heron.nb
Show that the area, K, of a triangle 4ABC is given by
p
K = s(s − a)(s − b)(s − c),
where the semi-perimeter s = (a + b + c)/2, and a, b and c are the lengths of the sides.
—–
Area of Triangle Configurations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . triarea.nb
V3
a3
s2 s1
a1 a2
V1 s3 V2
250 Chapter 17 Area
For the triangle illustrated in the figure, show that the area, A1 , associated with the AAS
(angle-angle-side) configuration whose parameters are a1 , a2 and s1 is given by
s21 sin(a2 ) sin(a1 + a2 )
A1 = .
2 sin(a1 )
Show that the area, A2 , associated with the ASA (angle-side-angle) configuration whose pa-
rameters are a1 , s3 and a2 is given by
s23 sin(a1 ) sin(a2 )
A2 = .
2 sin(a1 + a2 )
Show that the area, A3 , associated with the SAS (side-angle-side) configuration whose para-
meters are s1 , a2 and s3 is given by
s1 s3 sin(a2 )
A3 = .
2
—–
Area of Triangle Bounded by Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . triarlns.nb
Show that the area of the triangle bounded by the lines
y = m1 x + c1 , y = m2 x + c2 and x = 0
is given by
1 (c1 − c2 )2
A= p .
2 (m1 − m2 )2
—–
Areas Related to Hyperbolas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hyparea.nb
Referring to Figure 17.7, use calculus to verify that the areas between two parameters t1
and t2 of a segment and a sector of a hyperbola are given by
ab
Asegment = (sinh(s(t2 − t1 )) − s(t2 − t1 ))
2
abs
Asector = (t2 − t1 )
2
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively,
s = cosh−1 (e), and e is the eccentricity of the hyperbola (assuming the parameterization
Descarta2D uses for a hyperbola).
—–
Area of a Conic Arc (General) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . caarea1.nb
For the conic arc whose control points are (0, 0), (a, b) and (d, 0), show that the area
between the conic arc and its chord is given by
bdρ 1−ρ
A = 3 ρr + (−1 + ρ)2 loge
2r ρ+r
17.9 Explorations 251
√
where r = −1 + 2ρ (assuming b > 0 and d > 0).
—–
Area of a Conic Arc (Parabola). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .caarea2.nb
Show that the area between a conic arc whose projective discriminant is ρ = 12 and its
chord is given by
bd
A=
3
when the control points are (0, 0), (a, b) and (d, 0).
—–
One-Third of a Circle’s Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . circarea.nb
Show that the angle, θ, subtended by a segment of a circle whose area is one-third the area
of the full circle is the root of the equation
π θ − sin θ
= .
3 2
Also, show that θ is within 1/2 percent of 5π/6 radians.
—–
Equal Areas Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . eqarea.nb
Given 4ABC with vertices A(xA , yA ), B(xB , yB ) and C(xC , yC ) show that there are four
positions of a point Pn (x, y) such that 4AP B, 4AP C and 4BP C have equal areas. The
coordinates of Pn are given by
P0 ( 13 (xA + xB + xC ), 13 (yA + yB + yC ))
P1 (−xA + xB + xC , −yA + yB + yC )
P2 (+xA − xB + xC , +yA − yB + yC )
P3 (+xA + xB − xC , +yA + yB − yC ).
P0 is the centroid of 4ABC and 4P1 P2 P3 . 4ABC connects the midpoints of the sides of
4P1 P2 P3 .
—–
Area of a Tetrahedron’s Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tetra.nb
A tetrahedron is a three-dimensional geometric object bounded by four triangular faces.
Given a tetrahedron with vertices O(0, 0, 0), A(a, 0, 0), B(0, b, 0) and C(0, 0, c) show that the
areas of the triangular faces are related by the equation
where Axyz is the area of the triangle whose vertices are x, y and z. Note the similarity to
the Pythagorean Theorem for right triangles.
—–
Part V
Tangent Curves
Chapter 18
Tangent Lines
Let two points, P and Q, be taken on any locally smooth convex curve, and let the point Q
move along the curve nearer and nearer to the point P ; then the limiting position of the line
P Q, as Q moves up to and ultimately coincides with P , is called the tangent line to the curve
at point P . The line through P perpendicular to the tangent line is called the normal to the
curve at the point P .
(x1 − h)
y − y1 = − (x − x1 ). (18.1)
(y1 − k)
255
256 Chapter 18 Tangent Lines
y
P1 Hx1 , y1 L
CHh, kL
If the circle is centered at the origin, x2 + y 2 = r2 , the equation of the tangent line at P1 is
x1 x + y1 y = r2 .
If the circle is given in general form,
x2 + y 2 + ax + by + c = 0
then the tangent line at P1 is
a b
xx1 + yy1 + (x + x1 ) + (y + y1 ) + c = 0.
2 2
√
Example. Confirm that the point ( 52 , 1 + 3
2 ) is on the circle
(x − 2)2 + (y − 1)2 = 1
and find the tangent line at that point.
Solution. The function IsOn2D[point, circle] returns True if the point is on the
circle; otherwise, it returns False. TangentLines2D[point, circle] returns a list
of lines through the point and tangent to the circle.
In[1]: IsOn2D@p1 = Point2D@85 ê 2, 1 + Sqrt@3D ê 2<D,
c1 = Circle2D@82, 1<, 1DD
Out[1] True
è!!! è!!!
Out[2] 9Line2DA2, 2 3 , −2 I4 + 3 ME=
18.1 Lines Tangent to a Circle 257
y
Q1 è!!!!!!!!!!!!
!
d 2 - r2
q D
r x
Q2
d
In[3]: Sketch2D@8p1, c1, lns<, PlotRange −> 880, 4<, 8−1, 3<<D;
4
3
2
1
0
-1
0 1 2 3 4 5
y P0 Hx0 , y0 L
Q1
q
a
r x
Q2
Figure 18.3: Lines through a rotated point, tangent to a circle at the origin.
where
x0 y0
cos α = and sin α = .
d d
Using the standard trigonometric formulas for the sine and cosine of the sum of two angles
yields
where cos(α + θ) and sin(α + θ) are functions of (x1 , y1 ), (h, k), and r and d is the distance
between (h, k) and (x1 , y1 ). Notice that after the substitutions are performed no trigonometric
functions are present in the formulas.
18.1 Lines Tangent to a Circle 259
y
P1 Hx1 , y1 L
Q1
CHh, kL
r
Q2
where √
r d2 − r2
cos θ = and sin θ = ± .
d d
If the geometry is rotated and translated to a general position the coordinates of the contact
points are given by
Q1,2 (h + r cos(α + θ), k + r sin(α + θ))
where cos(α + θ) and sin(α + θ) have the same formulas as in the previous section.
Example. Find the lines passing through the point (3, −1) and tangent to the
circle (x + 1)2 + (y − 1)2 = 4. Find the coordinates of the points of tangency and
plot.
4
2
0
-2
-4 -2 0 2 4
D2 = d2 − r2
= (x1 − h)2 + (y1 − k)2 − r2 .
Therefore the length of the tangent line segment (squared) is found by substituting the coor-
dinates of the point into the equation of the circle.
Example. Find the length of the tangent line segment from the point (4, 3) to
the circle (x + 1)2 + (y + 2)2 = 4.
Solution. Descarta2D does not have a built-in function to compute the length of a
tangent line segment. However, a few built-in functions can be combined to apply
the technique described in this section. The function Quadratic2D[circle] returns
the quadratic equation of a circle. Polynomial2D[quad, {x, y}] substitutes the
coordinates (x, y) into the quadratic equation.
18.1 Lines Tangent to a Circle 261
y L¢¢
L
L¢¢
L¢
L¢ x
Of course this gives the same result as constructing the tangent points and finding
the distance directly.
In[7]: Distance2D@TangentPoints2D@Point2D@84, 3<D, c1D@@1DD,
Point2D@84, 3<DD êê Simplify
è!!!!!
Out[7] 46
Notice that the constant coefficient C of the line is not involved in the equations of the tangent
lines since only the slope is involved in establishing the parallel condition. The formula is
derived by constructing a line Lc that passes through the center (h, k) of the circle with slope
m = −A/B. The two tangent lines are then determined by offsetting Lc a distance ±r. Using
equations the derivation is
L ≡ Ax + By + C = 0
262 Chapter 18 Tangent Lines
Lc ≡ Ax + By − (Ah + Bk) = 0
ax + by − (ah + bk) = 0
L0 ≡ ax + by − (ah + bk ± r) = 0
p
Ax + By − (Ah + Bk ± r A2 + B 2 ) = 0.
where
A b
a= √ and b = √
2
A +B 2 A + B2
2
Ax + By + C = 0
Example. Find the lines tangent to the circle (x − 3)2 + (y − 2)2 = 1 and parallel
and perpendicular to the line 2x + 3y − 1 = 0 and plot.
In[9]: Sketch2D@8l1, c1, lns<, PlotRange −> 88−2, 5<, 8−2, 5<<D;
18.1 Lines Tangent to a Circle 263
5
4
3
2
1
0
-1
-2
-1 0 1 2 3 4 5
Example. Using the geometric objects from the previous example, find the points
of contact of the four tangent lines.
Solution. The function Point2D[line, circle] will return the point of contact if
the line is tangent to the circle.
In[10]: pts = Map@HPoint2D@#, Quadratic2D@c1DDL&,
Flatten@lnsDD êê Simplify
2 3 2 3
Out[10] 9Point2DA93 +
è!!!!! , 2 +
è!!!!! =E, Point2DA93 −
è!!!!! , 2 −
è!!!!! =E,
13 13 13 13
3 2 3 2
Point2DA93 −
è!!!!! , 2 +
è!!!!! =E, Point2DA93 +
è!!!!! , 2 −
è!!!!! =E=
13 13 13 13
5
4
3
2
1
0
-1
-2
-1 0 1 2 3 4 5
264 Chapter 18 Tangent Lines
y L
r2
r1 x
r12 (A2 + B 2 ) = 1
r22 (A2 + B 2 ) = (1 + Ad)2 .
Solving these two equations for A and B produces four pairs of solutions given by
A = r1 + sA r2
p
B = sB d2 − (r1 + sA r2 )2
18.1 Lines Tangent to a Circle 265
where the sign constants sA ={ − 1, −1, 1, 1} and sB ={1, −1, 1, −1} take on the values ±1
in pairs as shown in the lists. The first pair of solutions gives the external, or direct, tangents
and the second pair gives the internal, or transverse, tangents.
We now use the special solution given above to find the tangent lines when the circles are
in a general position. Let C1 ≡ (x − h1 )2 + (y − k1 )2 = r12 and C2 ≡ (x − h2 )2 + (y − k2 )2 = r22
be the equations of the two circles. To attain a general positioning we first rotate the lines
given in the special solution by an angle θ where sin θ = (h1 − h2 )/d and cos θ = (k1 − k2 )/d.
After the rotation we translate the lines from (0, 0) to (h1 , k1 ). Applying these transformations
yields the four lines
where
H = h1 − h2 and K = k1 − k2
and A and B take the values given as before.
Example. Find the four lines tangent to the circles (x − 3)2 + y 2 = 4 and
(x + 3)2 + y 2 = 4. Sketch the external tangents and the internal tangents in
separate plots.
In[13]: Sketch2D@8c1, c2, l1, l2<, PlotRange −> 88−6, 6<, 8−3, 3<<D;
Sketch2D@8c1, c2, l3, l4<, PlotRange −> 88−6, 6<, 8−3, 3<<D;
3
2
1
0
-1
-2
-3
-4 -2 0 2 4 6
266 Chapter 18 Tangent Lines
3
2
1
0
-1
-2
-3
-4 -2 0 2 4 6
ax2 + bxy + cy 2 + dx + ey + f = 0.
The equation of the chord joining any two points, P1 (x1 , y1 ) and P2 (x2 , y2 ), on the curve may
be written
as the equation is clearly first-degree in x and y (the terms above first-degree cancel out), and
it is satisfied by the two points P1 and P2 . Putting x1 = x2 and y1 = y2 , we get the equation
of the tangent line
or, expanding,
Adding dx1 + ey1 + f1 to both sides will cause the right-hand side to vanish, because P1
satisfies the equation of the curve. Thus the equation of the tangent becomes
b d e
ax1 x + (x1 y + y1 x) + cy1 y + (x + x1 ) + (y + y1 ) + f = 0. (18.4)
2 2 2
This equation is most easily remembered if we compare it with the equation of the curve
and notice that it is derived by replacing x2 and y 2 with x1 x and y1 y, xy with 12 (x1 y + y1 x)
and x and y with 12 (x + x1 ) and 12 (y + y1 ). Whether or not P1 (x1 , y1 ) is on the curve, the line
represented by Equation (18.4) is called the polar of P1 with respect to the curve, and P1 is
the pole of the line with respect to the curve.
18.2 Lines Tangent to Conics 267
Example. Find the line tangent to the parabola y 2 = 4x at the point (4, 4).
Solution. The Descarta2D function Line2D[point, conic] returns the polar (line)
of a pole (point) with respect to a conic. If the point is on the conic, then the line
will be tangent to the conic.
In[14]: l1 = Line2D@p1 = Point2D@84, 4<D,
crv = Parabola2D@80, 0<, 1, 0DD
5
4
3
2
1
0
-1
0 1 2 3 4 5 6 7
Q ≡ Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
we wish to determine the coordinates of the pole point, P1 (x1 , y1 ), of L with respect to
Q. The equation of the polar (line) of the pole (point) P1 is derived in general form from
Equation (18.4) and is given by
If this line and line L are the same line, then the coefficients of the polar line must be equal to
some multiple of the coefficients of L yielding the following system of three linear equations
in three unknowns
kp = 2Ax1 + By1 + D
kq = Bx1 + 2Cy1 + E
kr = Dx1 + Ey1 + 2F.
268 Chapter 18 Tangent Lines
Solving theses equations for (x1 , y1 ) and the constant k (k is ignored) gives
Q1 Q2
x1 = and y1 =
Q12 Q12
where
If the line L is tangent to Q, then (x1 , y1 ) is the point of tangency; otherwise, (x1 , y1 ) is the
pole of the polar L with respect to Q. If Q12 is zero, the coordinates of the pole are invalid.
This condition occurs when the polar L passes through the center of the conic.
Example. Show that the polar (line) found in the previous example corresponds
to the pole (point) of tangency.
Solution. The Descarta2D function Point2D[line, conic] returns the pole (point)
of a polar (line) with respect to a conic.
In[16]: Point2D@l1, crvD
Example. Find the value of c such that the line 2x + 5y + c = 0 is tangent to the
conic represented by 2x + xy − 4y 2 − 2x − 3y + 1 = 0 and plot.
18.2 Lines Tangent to Conics 269
Out[17] 80 + 24 c − 33 c2 == 0
4 è!!!!!!!! 4 è!!!!!!!!
Out[18] 99c → I3 − 174 M=, 9c → I3 + 174 M==
33 33
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-2 -1 0 1 2 3
Polar of a Conic
As previously shown, if the point P1 (x1 , y1 ) is on the conic curve
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
This equation expresses a relation between the coordinates (x, y) of any point on the tangent
line, and those of the point of contact (x1 , y1 ). But the equation, being symmetrical with
respect to the coordinates (x, y) and (x1 , y1 ), can be interpreted to represent the line passing
through the points of contact from (x1 , y1 ) when (x1 , y1 ) is not on the curve. Thus the polar,
which has the same equation as the tangent line, passes through the points of tangency (when
they are real) when the point is not on the curve.
Without proof we list the following theorems concerning poles and polars that refer to
Figure 18.7.
270 Chapter 18 Tangent Lines
L1
P1
L2
P2
• If the polar L1 of pole P1 passes through pole P2 , then the polar L2 of P2 passes through
P1 .
• If the polars of P1 and P2 intersect at point P , then P is the pole of the line P1 P2 .
• The polar of an exterior point P1 is the line joining the points of contact of the tangents
drawn from P1 .
• The polar of an interior point P is the locus of the point of intersection of the tangents
at the extremities of every chord through P .
• The polar of a focus is the corresponding directrix.
• There is no (finite) polar of the center of a conic.
Example. Show the inverse functional relationship between the polar and the pole
(3, −1) with respect to the quadratic equation 2x2 + 3xy − y 2 + 4x − 2y + 1 = 0.
Solution. The Descarta2D function Line2D[point, quad] returns the polar line
of the point with respect to the quadratic. The function Point2D[line, quad]
returns the pole (point) of the line with respect to the quadratic.
In[20]: l1 = Line2D@Point2D@83, −1<D,
q1 = Quadratic2D@2, 3, −1, 4, −2, 1DD
x2 y2 x2 y2
+ = 1 and + = 1.
16 4 4 9
Plot the ellipses and the tangent lines.
4
2
0
-2
-4
-4 -2 0 2 4
Example. Using the geometric objects from the previous example, find the line
segments connecting the contact points of the tangent lines.
18.3 Lines Tangent to Standard Conics 273
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
Tangents to a Parabola
A line that is parallel to the axis of a parabola intersects the parabola in only one (finite)
point; all other lines will cut the parabola in two points real and distinct, real and coincident,
or complex. Any line which meets a parabola in two coincident points is a tangent line.
Table 18.1 provides formulas for the line tangent to a parabola in standard form at a point
P1 (x1 , y1 ). Table 18.2 provides the formulas for tangents to a parabola in standard form with
a given slope m.
Example. Find the lines through the point (−1, −1) that are tangent to the
parabola (y + 1)2 = 2(x − 1) and plot.
274 Chapter 18 Tangent Lines
2
1
0
-1
-2
-3
-4
-2-1 0 1 2 3 4 5
Tangents to an Ellipse
A line that intersects an ellipse in two coincident points is a tangent line. As in the case
of the circle, but unlike that of the parabola, there will be two tangents with a given slope.
Table 18.3 provides formulas for the line tangent to an ellipse in standard form at a point
P1 (x1 , y1 ). In the formulas a is the length of the semi-major axis of the ellipse and b is the
length of the semi-minor axis. Table 18.4 provides the formulas for tangents to an ellipse in
standard form with a given slope m.
18.3 Lines Tangent to Standard Conics 275
-2
-4
-4 -2 0 2 4
276 Chapter 18 Tangent Lines
Tangents to a Hyperbola
A line that intersects a hyperbola in two coincident points is a tangent line. For the hyperbola
there will be two tangent lines (real and distinct, coincident with an asymptote, or complex)
with a given slope. Table 18.5 provides formulas for the line tangent to a hyperbola in standard
form at a point P1 (x1 , y1 ). In the formulas a is the length of the semi-transverse axis of the
hyperbola and b is the length of the semi-conjugate axis. Table 18.6 provides the formulas for
tangents to a hyperbola in standard form with a given slope m. Note that for real tangents
with slope m the quantity under the radical must be positive. If, for a given slope, the tangents
are real for a particular hyperbola, then the tangents are complex for the conjugate hyperbola.
7.5
5
2.5
0
-2.5
-5
-7.5
-10
-5 0 5 10
278 Chapter 18 Tangent Lines
(x + 1)2 (y − 2)2
+ =1
4 16
and plot.
In[33]: Sketch2D@8l1, e1, lns<, PlotRange −> 88−8, 6<, 8−5, 7<<D;
6
4
2
0
-2
-4
-6 -4 -2 0 2 4 6
280 Chapter 18 Tangent Lines
18.4 Explorations
Line Tangent to a Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lntancir.nb
√
Show that the line y = m(x − a) + a 1 + m2 is tangent to the circle x2 + y 2 = 2ax for all
values of m.
—–
Line Normal to a Quadratic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lnquad.nb
Show that the normal line passing through the point (x1 , y1 ) on the quadratic whose equa-
tion is Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0 is given by
k1 x − k2 y − k1 x1 + k2 y1 = 0
where
k1 = Bx1 + 2Cy1 + E and k2 = 2Ax1 + By1 + D.
—–
Eyeball Theorem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . eyeball.nb
r1 r2
The tangents to each of two circles from the center of the other are drawn as shown in the
figure. Prove that the chords illustrated are equal in length.
—–
Perpendicular Tangents to a Parabola. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbtnlns.nb
Show that if L1 and L2 are two lines tangent to a parabola that intersect on the directrix
of the parabola, then L1 and L2 are perpendicular to each other.
—–
Tangent to a Parabola with a Given Slope. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pbslp.nb
Show that the line tangent to the parabola y 2 = 4px with slope m is y = mx + p/m.
—–
18.4 Explorations 281
—–
Tangent to a Hyperbola with Given Slope. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . hypslp.nb
Show that √the lines tangent to the hyperbola x2 /a2 − y 2 /b2 = 1 with slope m are given
by y = mx ± a2 m2 − b2 .
—–
Tangency Point on Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tancirpt.nb
Show that if a line Ax + By + C = 0 is tangent to a circle (x − h)2 + (y − k)2 = r2 then
the coordinates of the point of tangency are
Ar2 Br2
h− ,k − .
Ah + Bk + C Ah + Bk + C
—–
Monge’s Theorem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . monge.nb
Given three circles and the external tangent lines of the circles taken in pairs, show that
the three intersection points of the three tangent pairs lie on a straight line.
—–
Line Tangent to a Conic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lntancon.nb
Show that the relationship between the coefficients of a line px + qy + r = 0 tangent to the
conic Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0 is given by
—–
Normals and Minimum Distance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . normal.nb
Given a point P0 (x0 , y0 ) and a quadratic Q, find point(s) P (x, y) on Q such that the line
P P0 is perpendicular to Q at P . Such a line is called a normal to the quadratic. Use the
points P to find the minimum distance from P0 to Q. Assume that P0 and Q are defined
numerically.
—–
Chapter 19
Tangent Circles
283
284 Chapter 19 Tangent Circles
3
2
1
0
-1
-2
-3
-4 -3 -2 -1 0 1 2
2
1
0
-1
-2
-4 -2 0 2 4
1 1 è!!!!!
Out[5] 9Circle2D@8−1, 0<, 2D, Circle2DA90, =, I−2 + 17 ME,
2 2
1 1 è!!!!! 13 12 26
Circle2DA90, =, I2 + 17 ME, Circle2DA9 , =, E=
2 2 11 11 11
3
2
1
0
-1
-2
-4 -2 0 2 4
-2
-4
-4 -2 0 2 4
Example. Construct and plot the circle(s) tangent to the three lines x−y +1 = 0,
x + y − 1 = 0 and y + 1 = 0.
Solution. Use the function TangentCircles2D[{ln, ln, ln}] that returns a list
of circles tangent to the three lines.
19.6 Explorations 289
In[10]: Sketch2D@8l1, l2, l3, cirs<, PlotRange −> 88−5, 5<, 8−5, 5<<D;
-2
-4
-4 -2 0 2 4
19.6 Explorations
Archimedes’ Circles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .archimed.nb
C¢
C¢¢
r3
r1
r2
x
290 Chapter 19 Tangent Circles
Draw the vertical tangent line at the intersection point of the two smaller tangent circles, c1
and c2 , in an arbelos (shoemaker’s knife, see figure). Prove that the two circles C 0 and C 00
tangent to this line, the large semicircle, c3 and c1 and c2 are congruent (have equal radii).
These circles are known as Archimedes’ Circles.
—–
Circle Tangent to Circle, Given Center . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tancir1.nb
Show that the radii of the two circles centered at (h1 , k1 ) and tangent to the circle
(x − h2 )2 + (y − k2 )2 = r22
are given by
r = |d ± r2 |
p
where d = (h1 − h2 )2 + (k1 − k2 )2 . This formula is a special case of the Descarta2D function
TangentCircles2D[{pt | ln | cir}, point].
—–
Circle Tangent to Circle, Center on Circle, Radius. . . . . . . . . . . . . . . . . . tancir2.nb
Show that the centers (h, k) of the two circles passing through the point (x1 , y1 ) with center
on the circle x2 + y 2 = 1 and radius r = 1 are given by
p p !
x1 y1 4 − d21 y1 x1 4 − d21
(h, k) = ± , ∓
2 2d1 2 2d1
p
where d1 = x21 + y12 . This is a special case of the Descarta2D function
A1 x + B1 y = 0 and − B1 x + A1 y = 0
(h, k) = (A1 − B1 , A1 + B1 ),
= (A1 + B1 , −A1 + B1 ),
= (−A1 − B1 , A1 − B1 ) and
= (−A1 + B1 , −A1 − B1 ).
Assume that the two lines are normalized, A21 + B12 = 1. This construction is a special case of
the Descarta2D function TangentCircles2D[{obj1, obj2 }, r] when the two objects are lines.
—–
19.6 Explorations 291
This is a special case of TangentCircles2D[{obj1, obj2 }, ln | cir] where the two objects are
points.
—–
Circle Tangent to Three Lines.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .tancir5.nb
Show that the radii of the four circles tangent to the lines
x = 0, y = 0 and Ax + By + C = 0,
are given by
C
r =
1 ± A± B
taking all four combinations of signs and assuming the lines are normalized. This is a special
case of the function TangentCircles2D[{obj1, obj2 , obj3 }] where all three of the objects are
lines.
—–
Circles Tangent to an Isosceles Triangle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tncirtri.nb
A circle is inscribed in an isosceles triangle with sides a, a and 2b in length. A second,
smaller circle is inscribed tangent to the first circle and to the equal sides of the triangle. Show
that the radius of the second circle is
s
(a − b)3
r=b .
(a + b)3
Tangent Conics
293
294 Chapter 20 Tangent Conics
Q1 ≡ A1 x2 + B1 xy + C1 y 2 + D1 x + E1 y + F1 = 0 and
Q2 ≡ A2 x2 + B2 xy + C2 y 2 + D2 x + E2 y + F2 = 0
represent the equations of the two quadratics, then Q ≡ Q1 + kQ2 = 0, for any constant k, is
the equation of a quadratic through the points of intersection of Q1 and Q2 . The equation Q
is called a system or pencil of quadratics, and placing one additional condition on the equation
for Q allows us to solve for k and find a specific quadratic in the pencil. The equation of the
pencil is sometimes written as Q ≡ (1 − k)Q1 + kQ2 in order to allow the original quadratics,
Q1 and Q2 , to be in the pencil (for k = 0 and k = 1, respectively).
Example. Find the quadratic that passes through the intersection of the ellipse
x2 + 4y 2 − 10x − 39 = 0 and the hyperbola −x2 + y 2 − 1 = 0 and also passes
through the point (−4, 0).
and this must be satisfied by (−4, 0). Hence, solving for k yields k = 1 and the
final equation of the conic sought is x2 + 2y − 8 = 0 (a parabola).
In[1]: Sketch2D@8Quadratic2D@1, 0, 4, −10, 0, −39D,
Quadratic2D@−1, 0, 1, 0, 0, −1D,
Quadratic2D@0, 0, 1, −2, 0, −8D,
Point2D@8−4, 0<D<,
CurveLength2D −> 40,
PlotRange −> 88−10, 15<, 8−6, 6<<D;
6
4
2
0
-2
-4
-6
-5 0 5 10 15
20.2 Systems of Quadratics 295
A Degenerate Case
If Q = 0 is the equation of a quadratic and L = 0 is the equation of a straight line, then
Q + kL2 = 0 is the equation of a quadratic tangent to Q at the intersection points of Q = 0
and L = 0. We may think of L2 = 0 as a (degenerate) quadratic (two coincident lines)
intersecting Q = 0 in two pairs of coincident points each.
Substituting (−1, 0) into this equation we get k = 1/8, which yields as the equation
of the conic sought
4
2
0
-2
-4
-4 -2 0 2 4
296 Chapter 20 Tangent Conics
P4
P5
P3
P1
P2
Degenerate conics may exist that satisfy configurations of points and lines that violate these
restrictions, but we will focus our attention on cases that produce proper conics (circles,
parabolas, ellipses and hyperbolas).
Example. Find the quadratic passing through the five points (3, 0), (3, 1), (0, 1),
(−3, 0) and (0, −1).
Solution. The function Quadratic2D[pt, pt, pt, pt, pt] returns the quadratic
passing through the five points.
In[3]: pts = 8p1 = Point2D@83, 0<D, p2 = Point2D@83, 1<D,
p3 = Point2D@80, 1<D, p4 = Point2D@8−3, 0<D,
p5 = Point2D@80, −1<D<;
q1 = Quadratic2D@p1, p2, p3, p4, p5D
Example. Find the conic represented by the quadratic found in the previous
example. Plot the points and the conic curve.
Solution. The conic can be determined directly from the result of the previous
example using the function Loci2D[quad]. Descarta2D also provides the function
TangentConics2D[{pt, pt, pt, pt, pt}] that constructs a list containing the conic
directly from the five points.
298 Chapter 20 Tangent Conics
1
0.5
0
-0.5
-1
-3 -2 -1 0 1 2 3
P2
P3
P1 L5
P4
Example. Find the quadratics passing through the points (2, 1), (−2, 1), (−2, −1)
and (2, −1) and tangent to the line 3x+4y−12 = 0. Plot the conic curves associated
with the quadratics.
P4
P3
L1
P2
P1
Figure 20.3: Four points, one line, one point on the line.
5
4
3
2
1
0
-1
-2
-2 0 2 4
Example. Find the conic curve passing through the points (2, 0), (0, 1), (−2, 0)
and (0, −1) and tangent to the line y = 1.
20.6 Three Points, Two Tangent Lines 301
Solution. The function TangentConics2D[{pt, pt, pt, pt, ln}] returns a list of
conic curves passing through four points and tangent to a line. The points and
line may be listed in any order.
1.5
1
0.5
0
-0.5
-1
-1.5
-2 -1 0 1 2 3
Descarta2D Hint. In the remaining sections of this chapter we will use the
function TangentConics2D to find the tangent curves satisfying a variety of con-
ditions. The function TangentQuadratics2D is also available in all these cases
and will return a list of quadratics instead of a list of conic curves.
L45 ≡ ax + by − 1 = 0
302 Chapter 20 Tangent Conics
P1
P2
L45
L4 L5
P3
assuming we can guarantee that L45 does not pass through the origin. The point P1 is clearly
not on L45 because that would imply that the conic passes through three distinct, collinear
points, which clearly violates the validity conditions. Therefore, if we translate all five of the
original objects so that point P1 is at the origin, we can guarantee that L45 does not pass
through the origin. Of course we need to perform the inverse translation on the resulting conic
curves to produce the solution for the geometry in its original position.
We now proceed with L45 ≡ ax + by − 1 = 0, a line that does not pass through the origin.
Consider the pencil of quadratics parameterized by the variable k and represented by the
equation
Q ≡ L4 L5 − kL245 = 0.
(L4 [P1 ])(L5 [P1 ])(L245 [P2 ]) = (L4 [P2 ])(L5 [P2 ])(L245 [P1 ])
(L4 [P2 ])(L5 [P2 ])(L245 [P1 ]) = (L4 [P1 ])(L5 [P1 ])(L245 [P2 ]).
20.6 Three Points, Two Tangent Lines 303
Solving these equations for a and b yields four pairs of solutions which can be substituted into
L1 L2
k= [P1 ]
L245
producing four quadratics Q satisfying the stated conditions. The resulting quadratics may
be translated back to the original position of the defining objects by translating the origin
back to P1 .
√ √
Example. Find the conics passing through (1, 0), (0, −1), (1/ 2, −1/ 2) and
tangent to the lines x = 1 and y = −1.
Solution. The function TangentConics2D[{pt, pt, pt, ln, ln}] returns a list of
conic curves passing through three points and tangent to two lines. The points
and lines may be listed in any order.
2 2
1 1
0 0
-1 -1
-2 -2
-3 -3
-4 -4
-1 0 1 2 3 4 -1 0 1 2 3 4
304 Chapter 20 Tangent Conics
P2
L4 L1
P3
P1
2 2
1 1
0 0
-1 -1
-2 -2
-3 -3
-4 -4
-1 0 1 2 3 4 -1 0 1 2 3 4
Example. Find the conic curves passing through the points (0, 1), (−3, 0) and
(0, −1) and tangent to the lines y = 1 and x − 2y − 3 = 0.
20.6 Three Points, Two Tangent Lines 305
L3
P3 P2
L13
L1
P1
Figure 20.6: Three points, two lines, two points on the lines.
Solution. The function TangentConics2D[{pt, pt, pt, ln, ln}] returns a list of
conic curves passing through three points and tangent to two lines. The points
and lines may be listed in any order.
1
0
-1
-2
-3
-6 -4 -2 0 2 4
Q ≡ L1 L3 + kL213 = 0
where L13 is the line passing through points P1 and P3 . We now apply Equation (20.1)
establishing the condition that P2 must be on Q and, therefore, the coordinates (x2 , y2 ) must
satisfy Q. We can solve this linear equation for k and determine the coefficients of the quadratic
Q satisfying the stated conditions.
Example. Find the conic curve passing through the points (2, 1), (−2, 1) and
(0, 2) and tangent to the lines x − 3y + 1 = 0 and 2x + y + 3 = 0.
Solution. The function TangentConics2D[{pt, pt, pt, ln, ln}] returns a list of
conic curves passing through three points and tangent to two lines. The points
and lines may be listed in any order.
In[15]: objs = 8Point2D@82, 1<D, Point2D@8−2, 1<D, Point2D@80, 2<D,
Line2D@1, −3, 1D, Line2D@2, 1, 3D<;
crvs = TangentConics2D@objsD êê N
4
3
2
1
0
-1
-4 -2 0 2 4
Notice that a ConicArc2D object is a special case of this construction where the start and
end points are the points P1 and P3 and the apex point defines the lines L1 and L3 .
Let C be a circle in the plane and P a point. The reciprocal of P with respect to C is
simply the polar line of P with respect to C. Similarly, let L be a line. The reciprocal of L
with respect to C is the pole point of L with respect to C. It is noteworthy that the center
point of the circle has no reciprocal, and any line passing through the center of the circle has
no reciprocal.
If we have any figure consisting of any number of points and straight lines, and we take the
polars of those points and the poles of the lines, with respect to a circle C, we obtain another
figure which is called the polar reciprocal of the former with respect to the auxiliary circle C.
When a point in one figure and a line in the reciprocal figure are pole and polar with respect
to the auxiliary circle, C, the point and line are said to correspond to one another.
An important theorem from the analytic geometry of conics states that taking the recip-
rocal of all the points of a conic Q with respect to some auxiliary circle C will produce an
envelope of lines tangent to another conic Q0 . Furthermore, any line tangent to Q will corre-
spond to a point P 0 on Q0 , and any line L0 tangent to Q0 will correspond to a point P on Q
(always using C as the auxiliary circle).
We use this theorem as follows to find conics tangent to three, four or five lines and passing
through a corresponding number of points so the total number of conditions equals five. First
we apply an arbitrary translation to the objects to insure that none of the points lie at the
origin and that none of the lines pass through the origin. We now take the reciprocal of the
points or lines with respect to a unit circle centered at the origin, thereby producing a new
figure of corresponding lines and points. Note that if there are three or more lines in the
original figure, there will be two or fewer lines in its reciprocal.
We now apply the techniques developed in the previous sections of this chapter to find
the quadratics(s) satisfying the conditions imposed by the elements in the reciprocal figure.
Finally, we find the reciprocal of the resulting quadratic with respect to the auxiliary circle
yielding the sought-after quadratics in the original figure. If the equation of the quadratic in
the reciprocal figure is
Q0 ≡ ax2 + bxy + cy 2 + dx + ey + f = 0
then its equation in the original figure is given by
Q0 = (4cf − e2 )x2 + (2de − 4bf )xy + (4af − d2 )y 2 +
(4cd − 2be)x + (4ae − 2db)y + (4ac − b2 ) = 0.
The validity of this relationship is demonstrated in the exploration recquad.nb. The rela-
tionship between Q and Q0 is only valid when the auxiliary circle is a unit circle at the origin
(x2 + y 2 = 1).
Example. Find the conic curves passing through the points (3, −1) and (1, 0) and
tangent to the lines 4x − y − 3 = 0, x + 2y − 3 = 0 and y = −2.
308 Chapter 20 Tangent Conics
Solution. The function TangentConics2D[{pt, pt, ln, ln, ln}] returns a list of
conic curves passing through two points and tangent to three lines. The points
and lines may be listed in any order. If neither point is on any of the lines, there
are at most four real conic curves; if one of the points is on one of the lines, then
there are at most two real conic curves; if two of the points are on the tangent
lines, then there is at most one real conic curve.
2
1
0
-1
-2
-3
-4
0 2 4 6 8
Example. Find the conic curves passing through the point (−1, 1) and tangent
to the lines 4x − y − 3 = 0, x + 2y − 3 = 0, x = −3 and y = −2.
Solution. The function TangentConics2D[{pt, ln, ln, ln, ln}] returns a list of
conic curves passing through a point and tangent to four lines. The points and
lines may be listed in any order. If the point is not on any of the lines, there will
be at most two real conic curves; if the point is on one of the lines, then there will
be at most one real conic curve.
20.7 Conics by Reciprocal Polars 309
3
2
1
0
-1
-2
-3
-3-2-1 0 1 2
Solution. The function TangentConics2D[{ln, ln, ln, ln, ln}] returns a list of
at most one conic curve tangent to five lines.
In[21]: objs = 8Line2D@1, −2, 3D, Line2D@1, 0, −3D,
Line2D@2, −3, −2D, Line2D@0, 1, −2D, Line2D@1, 0, 2D<;
crvs = TangentConics2D@objsD êê N
3
2
1
0
-1
-2
-3 -2 -1 0 1 2 3 4
310 Chapter 20 Tangent Conics
20.8 Explorations
Reciprocals of Points and Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . recptln.nb
Show that the polar reciprocal of A1 x+B1 y +C1 = 0 in the auxiliary conic C ≡ x2 +y 2 = 1
is the point (−A1 /C1 , −B1 /C1 ), assuming that the line does not pass through the origin. Also,
show that the line x + y − 1 = 0 is the polar reciprocal of the point (x, y) with respect to C.
—–
Reciprocal of a Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . reccir.nb
Given a circle C1 ≡ (x − h)2 + (y − k)2 = r2 show that its polar reciprocal in the auxiliary
conic x2 + y 2 = 1 is given by the quadratic
Furthermore, show that Q is an ellipse, if the origin (0, 0) is inside C; a parabola, if the origin
is on C; and a hyperbola, if the origin is outside C.
—–
Reciprocal of a Quadratic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . recquad.nb
Given a general quadratic Q ≡ ax2 + bxy + cy 2 + dx + ey + f = 0 show that the reciprocal
of Q is the quadratic
Biarcs
In this chapter we will demonstrate some techniques for adding new functions to Descarta2D.
To make the demonstration realistic, we will introduce the mathematics for a new type of
tangent circle construction called a biarc. Biarcs are used in some graphical computer systems
to connect a set of data points with smoothly joined arcs. The mathematics of biarcs is by
itself interesting and will serve as a good example of extending the capabilities of Descarta2D.
according to the kind of contact, external (sum of radii) or internal (difference of radii).
We take positive values of r1 and r2 to indicate that the center points of the carrier circles,
C1 and C2 , are offset in the direction of T̂10 and T̂20 , respectively. T̂10 (−v1 , u1 ) and T̂20 (−v2 , u2 )
are unit vectors constructed by rotating tangent vectors T̂1 and T̂2 90◦ counter-clockwise.
Suppose we now wish to form an expression for the left-hand side of Equation (21.1). It can
be shown that the expressions (r1 +r2 )2 and (r1 −r2 )2 represent all cases for the sum (squared)
and difference (squared) of the biarc radii for all combinations of positive or negative r1 and
r2 for both internally and externally tangent carrier circles.
We introduce a radius sign constant, sr , which may take on the values ±1, in order to
311
312 Chapter 21 Biarcs
T1
T2 P2 P1
r1
r2 C1
C2
Note that it makes no difference whether we associate sr with r1 or r2 , since after squaring
and applying s2r = 1, the relationship is symmetric,
C1 = (x1 − v1 r1 , y1 + u1 r1 ) (21.3)
C2 = (x2 − v2 r2 , y2 + u2 r2 ).
Combining Equations (21.2) and (21.3) as suggested by Equation (21.1), the sum or difference
of the radii (squared) equals the distance (squared) between C1 and C2 , yields
When simplifying Equation (21.4), note that the relationships u21 + v12 = 1 and u22 + v22 = 1
can be used, since T̂1 and T̂2 are defined as unit vectors. Rearranging Equation (21.4) and
using the following substitutions
f0 = u1 u2 + v1 v2
f1 = −v1 (x2 − x1 ) + u1 (y2 − y1 )
f2 = −v2 (x2 − x1 ) + u2 (y2 − y1 )
d2 = (x2 − x1 )2 + (y2 − y1 )2
21.1 Biarc Carrier Circles 313
Radii Ratio
If a relationship between the carrier circle radii, r1 and r2 , is specified, then Equation (21.5)
can be solved for the radii. We choose to specify the biarc radii ratio, κ = r1 /r2 , as the
defining relationship. Substituting r1 = κr2 into Equation (21.5) produces the equation
d2
κ(sr + f0 )r22 + (κf1 − f2 )r2 = . (21.6)
2
Solving Equation (21.6) by using the quadratic formula yields
p
(f2 − κf1 ) ± (f2 − κf1 )2 + 2κd2 (sr + f0 )
r2 = (21.7)
2κ(sr + f0 )
p
(f2 − κf1 ) ± (f2 − κf1 )2 + 2κd2 (sr + f0 )
r1 = .
2(sr + f0 )
In the special case where the tangent vectors are in the same direction, the denominator
(sr + f0 ) will equal zero, and the quadratic equation degenerates and the solution of the
resulting linear equation is
κd2 d2
r1 = and r2 = . (21.8)
2(κf1 − f2 ) 2(κf1 − f2 )
Thus, by specifying a biarc radii ratio, κ, and applying Equation (21.7) or (21.8) we
may calculate values for r1 and r2 . Equation (21.3) allows us to calculate the corresponding
coordinates of the carrier circle centers, C1 and C2 . In certain configurations only one arc is
needed to satisfy the position and tangent constraints. In this case, the equations will produce
centers and radii for two identical circles.
Number of Solutions
Given a specific pair of points, P1 and P2 and tangent vectors, T̂1 and T̂2 , we now consider
how many different carrier circle pairs exist for a given radii ratio, κ. The solutions may be
enumerated as follows:
314 Chapter 21 Biarcs
• Equations (21.7) or (21.8) may produce negative values for r1 or r2 . The sign indicates
the directions the center points C1 and C2 should be offset from P1 and P2 , respectively.
As a result, both κ and −κ may produce valid biarcs with a specified radii ratio.
• The radius sign constant, sr , may take on two different values, ±1.
• The quadratic formula yields two different solutions due to the sign preceding the radical
sign as shown in Equation (21.7).
Therefore, as many as 2 × 2 × 2 = 8 unique carrier circle pairs may exist for a given biarc
configuration and radii ratio.
While it is a simple matter to compute the knot point once we have the two carrier circles,
we might instead want to specify the position of the knot point. We will show in this section
that the knot point cannot be selected arbitrarily, but must lie on one of two specific circles,
called the knot circles. The following theorem and corollary from elementary geometry (which
are stated without proof) will be central to exploring the nature of the knot circles.
Theorem. Angles at the circumference of a circle subtended by the same arc are
equal.
Corollary. Given two fixed points P1 and P2 and a variable point Q, the locus of
Q is a circle if 6 P1 QP2 is a constant.
Consider two internally tangent carrier circles centered at C1 (r1 , 0) and C2 (r2 , 0) and with
radii r1 and r2 , respectively, as shown in Figure 21.2. By construction the two circles are
internally tangent at the origin. Pick two arbitrary points P1 and P2 on the circles with
coordinates
P1 (r1 + r1 cos θ1 , r1 sin θ1 ) and P2 (r2 + r2 cos θ2 , r2 sin θ2 ).
21.2 Knot Point 315
p-w
w
P2
L2
r2
P1
a r1 q1 q2
O C1 C2 x
L1
We will show that the angle α ≡ 6 P1 OP2 is a constant angle for all such points P1 and P2
when the angle ω is constant, and, having established this fact, we will apply the corollary
stated above to establish that the knot point must be on one of two circles.
The slopes of lines OP1 and OP2 , m1 and m2 , are given by
r1 sin θ1 sin θ1 1
m1 = = = tan 2 θ1
r1 + r1 cos θ1 1 + cos θ1
r2 sin θ2 sin θ2 1
m2 = = = tan 2 θ2
r2 + r2 cos θ2 1 + cos θ2
m2 − m1
tan α =
1 + m1 m2
tan 12 θ2 − tan 12 θ1
=
1 + tan 12 θ1 tan 12 θ2
= tan 12 (θ2 − θ1 )
s
1 − cos(θ2 − θ1 )
= ± .
1 + cos(θ2 − θ1 )
316 Chapter 21 Biarcs
P¢2 P¢¢1
P1
r¢
P¢¢2
P¢1
r¢¢
P2
6L2 − 6 L1 = ω (or π − ω)
π
θ2 + 2 − θ1 + π2 = ω (or π − ω)
θ2 − θ1 = ω (or π − ω).
Notice that since ω is a constant, by definition, for any given biarc configuration, θ2 − θ1 is
also a constant. Since α is a function of θ2 − θ1 it must also be a constant. Now applying
the corollary, the knot point must be on one of two circles corresponding to the two constant
values of α. Similar proofs hold for other geometric configurations and also for externally
tangent circles.
d d
r0 = and r00 =
2 cos 12 ω 2 sin 12 ω
where d is the distance between P1 and P2 and ω is the angle between L1 and L2 .
Knot Circles
The first example illustrates a Mathematica function that will return a list of two knot circles
given a biarc configuration (tangent points and tangent lines). For simplicity we will use a
triangle to define the biarc configuration with the implicit understanding that the first and
third vertices of the triangle, V1 and V3 , are the tangent points, P1 and P2 , and sides V1 V2 and
V2 V3 of the triangle are the tangent lines, L1 and L2 . Using a triangle as an input parameter
has the added advantage that many invalid cases are avoided because they would involve
invalid triangles.
Lines 1, 2 and 3 define a Mathematica function called KnotCircles2D that takes one para-
meter that is required to pattern match a Descarta2D triangle object. Line 4 opens a Module
statement that defines two local variables pt1 and pt2. Line 5 constructs a point at the center
of a circle inscribed in the triangle. Line 6 constructs a point offset from the apex point, pA,
to the tangency point, p1, a negative distance defined by p2 and pA. Lines 8 and 9 construct
two circles from the two tangency points and a third point, pt1 or pt2.
318 Chapter 21 Biarcs
Example. Construct the two knot circles associated with the triangle whose
vertices are (0, 0), (2, 1) and (3, 0). Plot the geometric objects.
3
2
1
0
-1
-1 0 1 2 3 4
Arc Construction
In this section we will implement functions for constructing bulge factor arcs given defining
points and tangent vectors. These will be used later to construct biarcs. First, we define a
utility function, Cross2D, that computes a vector cross-product in two dimensions.
In[4]: Cross2D@8u1_, v1_<, 8u2_, v2_<D := u1 ∗ v2 − u2 ∗ v1;
21.4 Biarc Programming Examples 319
Now we define an arc construction function that takes the arc’s start and end points, P0
and P1 , as input, plus a point associated with the start point indicating the direction of the
tangent to the arc at the start point. The justification for this function is provided in the
exploration arcentry.nb.
The next arc construction function is similar to the previous one, except the point indi-
cating the tangent direction is associated with the end point of the arc. The justification for
this function is provided in the exploration arcexit.nb.
Knot Points
Now that we have functions for computing knot circles and constructing arcs involving tangent
vectors, it is fairly easy to construct biarcs. Consider the following Mathematica function:
The function Biarc2D takes two arguments, a Descarta2D triangle object defining the biarc
configuration (lines 1–3), and a Descarta2D point object defining the knot point (line 4).
The function Arc2D[{point, point}, point], defined in the previous section, is used twice to
actually construct the biarc which is returned as a list of two arcs (lines 5–6).
Example. Construct the biarc associated with the triangle whose vertices are
(0, 0), (2, 1) and (3, 0) and a knot point on the first knot circle at parameter value
π/2. Plot the geometric objects.
320 Chapter 21 Biarcs
1
0.8
0.6
0.4
0.2
0
0 0.5 1 1.5 2 2.5 3
Descarta2D Hint. The Biarc2D function does not check to insure that the
knot point provided is a valid knot point. It will erroneously return two arcs that
are not tangent to each other if it is called with a point not on one of the knot
circles. Other errors will occur if the knot point coincides with one of the triangle
vertices.
It would be convenient if the biarc construction function computed the knot point internally
as shown in the following Mathematica function:
In[10]: H∗1∗L Biarc2D@t1 : Triangle2D@p0 : 8x0_, y0_<,
H∗2∗L pA : 8xA_, yA_<,
H∗3∗L p1 : 8x1_, y1_<D,
H∗4∗L knotCircleNumber_Integer,
H∗5∗L knotPointParameter_ ? IsScalar2DD :=
H∗6∗L Module@8kc, ptK<,
H∗7∗L kc = KnotCircles2D@t1D@@knotCircleNumberDD;
H∗8∗L ptK = Point2D@kc@knotPointParameterDD êê N;
H∗9∗L Biarc2D@t1, ptKD D;
This Biarc2D function takes three arguments, the first being a triangle defining the biarc
configuration, the second an integer equal to 1 or 2 specifying which biarc circle the knot
point should be on, and the third an angle (in radians) specifying the parameter location on
the knot circle for the desired knot point. Lines 1–5 define the function arguments, line 7
computes the knot circle, line 8 computes the knot point, and line 9 computes the biarc.
21.4 Biarc Programming Examples 321
Example. Construct the biarc associated with the triangle whose vertices are
(0, 0), (2, 1) and (3, 0) and a knot point on the first knot circle at parameter value
π/2.
The Biarc2D functions implemented above are restrictive in the sense that the tangent
vectors always point toward the apex point of the triangle and no provision is available to
allow either (or both) of the tangent vectors to point away from the apex. In order to overcome
this restriction we will implement a function that takes two line segments to define the biarc
configuration. The line segments will define a position (the start point of the line segment)
and a direction (from the start point towards the end point).
These Biarc2D functions are parallel implementations of the previous two, except two line
segments are used to define the biarc configuration instead of a triangle.
322 Chapter 21 Biarcs
Example. Given a biarc configuration defined by the line segments from (0, 0) to
(−3, 2) and from (3, 0) to (4, −2) construct a set of biarcs whose knot points are
on knot circle 1 at parameter values π/3, π/2 and 2π/3.
4 4 4
3 3 3
2 2 2
1 1 1
0 0 0
-1 -1 -1
-1 0 1 2 3 4 -1 0 1 2 3 4 -1 0 1 2 3 4
Building on these basic Mathematica programs for computing biarcs, more elaborate con-
struction functions could be provided. For example, we might write a function that attempts
to automatically select the knot point based on some minimization criteria; or we might at-
tempt to construct biarcs that have no reversal of curvature at the knot point (i.e. the carrier
circles are internally tangent to each other). Another interesting exercise is to devise a strategy
for connecting a predefined set of points with a smooth, piecewise curve consisting of biarcs.
21.5 Explorations
Incenter on Knot Circle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . knotin.nb
Show that the incenter of a triangle (the center point of the circle inscribed in the triangle)
is on one of the knot circles for the biarc configuration defined by the triangle.
—–
Part VI
Reference
Chapter 22
Technical Notes
Symbolic. At the symbolic level, sizes, angles and coefficients are expressed as variables and
general formulas may be derived.
Analytic. At the analytic level variables are replaced with exact numerical quantities that
are not approximated by floating point numbers. Mathematical functions such as square
roots and trigonometric functions are carried without evaluation.
Numerical. At the numerical level numbers and functions are replaced with floating point
representations that are approximations carried to any number of decimal places in
Mathematica. Often, the accuracy is determined by the floating point hardware available
in the computer and is sufficient for such computations.
Depending on the complexity of the problem, Descarta2D often provides a choice of the level
of computation undertaken for a particular geometric investigation.
325
326 Chapter 22 Technical Notes
22.2 Names
In Mathematica symbolic names containing upper case letters are considered different than
names using corresponding lower case letters (i.e. Mathematica is case-sensitive with respect
to the interpretation of symbolic names). Mathematica uses the convention that system-
defined names always begin with upper case letters or the dollar sign symbol and recommends
that user-defined symbols begin with lower case letters to avoid naming conflicts. Descarta2D
follows the same naming conventions as Mathematica. Descarta2D symbolic names begin
with upper case letters; user symbolic names may contain upper case or lower case letters,
but, generally, the first letter is advised to be lower case to prevent conflicts with built-in
Mathematica functions and Descarta2D functions. In order to prevent conflicts with the names
of Descarta2D functions, this chapter provides suggestions for naming Descarta2D objects
to encourage consistency and clear understanding when using Descarta2D. Following these
conventions will avoid most naming conflicts.
All Descarta2D function names are fully spelled out English words and each name has
the ending 2D appended. If more than one word is used (for example, TangentConics2D, or
FocalLength2D), then the first letter of each word is upper case.
Descarta2D adheres to several syntactic conventions for consistency and ease of use. Func-
tions that return (construct) a Descarta2D object, such as Point2D, will always have the
form
objectName[arg1 , arg2 , ...].
For example, Point2D[point, point] returns the midpoint of two given points. Functions that
return a list of objects are generally plural, such as Points2D, TangentLines2D and Foci2D.
If Descarta2D detects invalid input when constructing an object, it generally displays an
error message and returns the $Failed symbol. Descarta2D functions that return a list of
objects will generally return an empty list, instead of the $Failed symbol (indicating that no
objects can be constructed).
object
geometry
coordinates {x, y}
point Point2D[{x, y}]
curve
line Line2D[A, B, C]
circle Circle2D[{h, k}, r]
parabola Parabola2D[{h, k}, f, θ] conic
ellipse Ellipse2D[{h, k}, a, b, θ]
hyperbola Hyperbola2D[{h, k}, a, b, θ]
quadratic Quadratic2D[A, B, C, D, E, F]
curve segment
line segment Segment2D[{x0, y0 }, {x1 , y1 }]
arc Arc2D[{x0, y0 }, {x1 , y1 }, B]
conic arc ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ]
composite
triangle Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }]
polynomial
linear Line2D[a, b, c]
ax + by + c
quadratic Quadratic2D[a, b, c, d, e, f]
ax2 + bxy + cy 2 + dx + ey + f
r
H
P1 C
D P0
2H
B = ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DÄ
built into Descarta2D. The objects are organized into a hierarchy as shown in Figure 22.1.
The hierarchy also includes meta-objects, objects that have no implementation, but serve to
organize the Descarta2D objects. Meta-objects are shown in italic font. The following sections
provide detailed descriptions of each object provided by Descarta2D. Each section provides the
name of the object, the syntax of the Mathematica expression for the object, names typically
used to refer to the object, a description of the object (using a mathematical equation when
appropriate) and restrictions on the arguments of the object. All objects have the restriction
that their arguments cannot involve complex numbers. The Line2D and Quadratic2D objects
are listed twice in Figure 22.1 because they can be interpreted to represent geometry or
polynomials.
Arc2D
Arc2D[{x0, y0 }, {x1 , y1 }, B] is the standard representation of an arc in Descarta2D as illus-
trated in Figure 22.2. The first and second arguments are the coordinates of the start and
end points of the arc, respectively. The third argument is a positive scalar, B, representing
the bulge factor of the arc. The bulge factor is the ratio of the arc’s height, H, to half the
chord length, D/2; so B = 2H/D. The arc is traversed counter-clockwise from P0 to P1 .
In the argument sequence of a function an arc is shown as arc, as in Radius2D[arc].
arc[0] gives the coordinates of the start point, arc[1] gives the coordinates of the end point
and Bulge2D[arc] gives the bulge factor. Suggested symbolic names for an Arc2D include the
series: (a1, a2, . . .), (A1, A2, . . .) and (arc1, arc2, . . .).
The parametric equations of an Arc2D using parameter t are
y
PHx, yL
r
CHh, kL
Circle2D
Circle2D[{h, k}, r] is the standard representation of a circle in Descarta2D as illustrated in
Figure 22.3. The center of the circle is given as a coordinate list, {h, k}, and the radius is the
positive scalar, r. The equation of the circle is
(x − h)2 + (y − k)2 = r2 .
In the argument sequence of a function, a Circle2D is shown as circle or cir, as in
Radius2D[circle] or Radius2D[cir]. The function Coordinates2D[circle] gives the center
point coordinates of a circle and Radius2D[circle] gives the radius, r. Suggested symbolic
names for a Circle2D include the series: (c1, c2, . . .), (C1, C2, . . .) and (cir1, cir2, . . .).
The parametric equations of a Circle2D using parameter θ are
x(θ) = h + r cos θ
y(θ) = k + r sin θ.
Values of θ in the range 0 ≤ θ < 2π generate coordinates on the complete circumference of the
circle. Circle2D[{h, k}, r][θ] returns the coordinates of the point on a circle at parameter
330 Chapter 22 Technical Notes
PA
h
r = ÄÄÄÄÄÄ
kÄ
k
h
P0 P1
θ. The expression Circle2D[{h, k}, r][θ][{θ1 , θ2 }] when used in a plotting command, such
as Sketch2D, will cause the arc of the circle between parameters θ1 and θ2 to be plotted.
Conic Arc
ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ] is the standard representation of a conic arc in
Descarta2D as illustrated in Figure 22.4. The first and third arguments are the coordinates of
the start and end points of the conic arc, respectively. The second argument is the coordinates
of the apex point of the conic arc (the apex point is the intersection point of the tangent lines
at the start and end points). The fourth argument, ρ, is a scalar representing the projective
discriminant of the conic arc. Values of ρ in the range 0 < ρ < 1/2 are elliptical arcs; values
in the range 1/2 < ρ < 1 are hyperbolic arcs; and the value 1/2 is a parabolic arc.
In an argument sequence, a ConicArc2D is shown as cnarc, as in Rho2D[cnarc]. The
function Coordinates2D[cnarc, Apex2D] returns the coordinates of the apex point of a conic
arc and Rho2D[cnarc] gives the value of ρ. ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ][t]
with t = 0 gives the coordinates of the start point and with t = 1 gives the coordinates of the
end point. Suggested symbolic names for a ConicArc2D include the series: (ca1, ca2, . . .),
(CA1, CA2, . . .) and (cnarc1, cnarc2, . . .).
The parametric equations of a ConicArc2D using parameter t are
when used in a plotting command, such as Sketch2D, will cause the portion of the conic arc
between parameters t1 and t2 to be plotted.
22.3 Descarta2D Objects 331
y
b
CHh, kL
a
q
Coordinates
Coordinates {x, y} are used to represent an (x, y) position in Descarta2D. In an argument
sequence coordinates are shown as coords such as Point2D[coords], or in explicit forms such
as {h, k} or {x, y} as in Point2D[{x, y}]. Suggested symbolic names for coordinates include
the series: (c1, c2, . . .), (C1, C2, . . .) and (coords1, coords2, . . .).
Ellipse2D
Ellipse2D[{h, k}, a, b, θ] is the standard representation of an ellipse in Descarta2D as il-
lustrated in Figure 22.5. The first argument, {h, k}, is a list of coordinates representing the
center of the ellipse. The second argument is a positive scalar, a, representing the length of
the semi-major axis. The third argument is a positive scalar, b, representing the length of the
semi-minor axis. In a valid ellipse, the length of the semi-major axis must be greater than
the length of the semi-minor axis, a > b. The fourth argument, θ, is the angle of rotation of
the ellipse measured from the +x-axis counter-clockwise to the major axis of the ellipse and
is normalized to the range 0 ≤ θ < π. The underlying equation of the (non-rotated) ellipse is
(x − h)2 (y − k)2
+ = 1.
a2 b2
In an argument sequence, an ellipse is shown as ellipse, as in Angle2D[ellipse]. The func-
tion Coordinates2D[ellipse] returns the center point coordinates of an ellipse; the function
SemiMajorAxis2D[ellipse]
CHh, kL
q a
SemiMinorAxis2D[ellipse]
gives the length of the semi-minor axis, b; and Angle2D[ellipse] gives the angle of rotation,
θ. Suggested symbolic names for an Ellipse2D include the series: (e1, e2, . . .), (E1, E2, . . .)
and (ell1, ell2, . . .).
The parametric equations of a (non-rotated) Ellipse2D using the parameter α are
x(α) = h + a cos α
y(α) = k + b sin α.
Values of α in the range 0 ≤ α < 2π generate coordinates on the complete circumference of the
ellipse. Ellipse2D[{h, k}, a, b, θ][α] returns the coordinates of the point on an ellipse at
parameter α. The expression Ellipse2D[{h, k}, a, b, θ][{α1 , α2 }] when used in a plotting
command, such as Sketch2D, will cause an arc of the ellipse between parameters α1 and α2
to be plotted.
Hyperbola2D
Hyperbola2D[{h, k}, a, b, θ] is the standard representation of a hyperbola in Descarta2D as
illustrated in Figure 22.6. The first argument, {h, k}, is a list of coordinates representing the
center of the hyperbola. The second argument is a positive scalar, a, representing the length
of the semi-transverse axis. The third argument is a positive scalar, b, representing the length
of the semi-conjugate axis. The fourth argument, θ, is the angle of rotation of the hyperbola
measured from the +x-axis counter-clockwise to the transverse axis of the hyperbola and is
normalized to the range 0 ≤ θ < π. The underlying equation of the (non-rotated) hyperbola
22.3 Descarta2D Objects 333
is
(x − h)2 (y − k)2
2
− = 1.
a b2
In an argument sequence, a hyperbola is shown as hyperbola, as in Angle2D[hyperbola].
The function Coordinates2D[hyperbola] returns the center point coordinates of a hyperbola;
the function
SemiTransverseAxis2D[hyperbola]
gives the length of the semi-transverse axis, a, and the function
SemiConjugateAxis2D[hyperbola]
gives the length of the semi-conjugate axis, b; and Angle2D[hyperbola] gives the angle of
rotation, θ. Suggested symbolic names for a Hyperbola2D include the series: (h1, h2, . . .),
(H1, H2, . . .) and (hyp1, hyp2, . . .).
The parametric equations of a (non-rotated) Hyperbola2D using parameter t are
x(t) = h + a cosh(st)
y(t) = k + b sinh(st)
where s = cosh−1 (e) and e is the eccentricity of the hyperbola. Values of t in the range
−∞ < t < ∞ generate coordinates on the branch of the hyperbola opening to the right in the
non-rotated position. Hyperbola2D[{h, k}, a, b, θ][t] returns the coordinates of the point
on a hyperbola at parameter t. The values t = ±1 generate coordinates at the ends of the
focal chord of the hyperbola. The expression Hyperbola2D[{h, k}, a, b, θ][{t1 , t2 }] when
used in a plotting command, such as Sketch2D, will cause an arc of the hyperbola between
parameters t1 and t2 to be plotted. If t1 < t2 , the arc will be on the right branch of the
(non-rotated) hyperbola; if t1 > t2 , the arc will be on the left branch of the (non-rotated)
hyperbola.
Line2D
Line2D[A, B, C] is the standard representation of an infinite line Ax + By + C = 0. At least
one of the first two coefficients, A or B, must be non-zero. The parametric equations of a line
using parameter t are
x(t) = ac + bt and y(t) = bc − at
where
A B C
a= √ , b= √ and c = √ .
A2
+B 2 2
A +B 2 A + B2
2
The coordinates of the point on the line nearest the origin will be at parameter t = 0 and
other coordinates, parameterized by distance t, −∞ < t < ∞, along the line are given by
Line2D[A, B, C][t]. The expression Line2D[A, B, C][{t1 , t2 }] when used in a plotting
command, such as Sketch2D, will cause a segment of the line between parameters t1 and t2
to be plotted.
334 Chapter 22 Technical Notes
f
axis
VHh, kL
Parabola2D
Parabola2D[{h, k}, f, θ] is the standard representation of a parabola in Descarta2D as il-
lustrated in Figure 22.7. The first argument, {h, k}, is a list of coordinates representing the
vertex of the parabola. The second argument is a positive scalar, f , representing the focal
length of the parabola. The third argument, θ, is the angle of rotation of the parabola mea-
sured from the +x-axis counter-clockwise to the axis of the parabola and is normalized to the
range 0 ≤ θ < 2π. The underlying equation of the (non-rotated) parabola is
(y − k)2 = 4f (x − h).
Values of t in the range −∞ < t < ∞ generate coordinates on the parabola opening to the
right in the non-rotated position. Parabola2D[{h, k}, f, θ][t] returns the coordinates of the
point on a parabola at parameter t. The values t = ±1 generate coordinates at the ends of the
22.3 Descarta2D Objects 335
focal chord of the parabola. The expression Parabola2D[{h, k}, f, θ][{t1 , t2 }] when used in
a plotting command, such as Sketch2D, will cause an arc of the parabola between parameters
t1 and t2 to be plotted.
Point2D
Point2D[{x, y}] (which is the same as Point2D[coords]) is the standard representation of a
point. The coordinates define the (x, y) position of the point. In an argument sequence, a
point is shown as point or pt, as in Coordinates2D[point] and Coordinates2D[pt]. Suggested
symbolic names for a Point2D include the series: (p1, p2, . . .), (P1, P2, . . .) and (pt1, pt2,
. . .).
XCoordinate2D[point] and YCoordinate2D[point] return the x- and y-coordinate, re-
spectively, of a point. Coordinates2D[point] returns the (x, y) coordinates of a point as a
coordinate list.
Quadratic2D
Quadratic2D[A, B, C, D, E, F] is the standard representation of the quadratic
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0.
At least one of the first five coefficients must be non-zero. In general, the quadratic will
represent a conic curve, but certain combinations of coefficients may represent degenerate
conics (lines and points) or no locus at all. In an argument sequence, a Quadratic2D is shown
as quad, as in Point2D[quad]. Suggested symbolic names for a Quadratic2D include the
series: (q1, q2, . . .), (Q1, Q2, . . .) and (quad1, quad2, . . .). Descarta2D provides no parametric
representation for a quadratic (the specific conics have parametric representations).
Segment2D
The form Segment2D[{x0, y0 }, {x1 , y1 }] is the standard representation of a line segment
in Descarta2D. The coordinates {x0 , y0 } and {x1 , y1 } are the start and end coordinates,
respectively, of the line segment.
In an argument sequence, a Segment2D is shown as lnseg, as in Angle2D[lnseg]. Suggested
symbolic names for a Segment2D include the series: (l1, l2, . . .), (L1, L2, . . .) and (lnseg1,
lnseg2, . . .).
The parametric equations of a Segment2D using parameter t are
x(t) = x0 + t(x1 − x0 )
y(t) = y0 + t(y1 − y0 ).
Values of t in the range 0 ≤ θ ≤ 1 generate coordinates over the complete length of the
line segment. Segment2D[{x0, y0 }, {x0 , y0 }][t] returns the coordinates of the point on a
line segment at parameter t. The parameter value t = 0 generates the coordinates of the
start point of the line segment and the value t = 1 generates the end point coordinates. The
336 Chapter 22 Technical Notes
y V3 Hx3 , y3 L
V2 Hx2 , y2 L
V1 Hx1 , y1 L
Triangle2D
Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }], as illustrated in Figure 22.8, is the standard rep-
resentation of a triangle with vertex points (x1 , y1 ), (x2 , y2 ) and (x3 , y3 ). The vertex points
cannot be coincident or collinear. Coordinates2D[triangle, n] returns the coordinates of
vertex n of a triangle, n = 1, 2, 3.
In an argument sequence a Triangle2D is shown as triangle, as in Area2D[triangle]. Sug-
gested symbolic names for a Triangle2D include the series: (t1, t2, . . .), (T1, T2, . . .) and
(tri1, tri2, . . .).
Object Queries
Each object in Descarta2D responds to a set of special queries essential to the operation of
Descarta2D. These special queries are listed below:
IsDisplay2D returns True if the object can be displayed using the Sketch2D command.
IsValid2D returns True if the object is a Descarta2D object and each of its parameters is of
the proper type and form.
ObjectNames2D returns a list of strings that are the names of all Descarta2D objects.
22.4 Descarta2D Packages 337
If you add a new object to Descarta2D, the object will need to respond properly to these
queries if you desire that the object behave in an integrated manner. Refer to the source code
listings to determine how each of these queries can be implemented.
although this directory path may be different for your installation of Mathematica. The
master package file for Descarta2D will be loaded by issuing the command <<Descarta2D‘.
After this command is entered, Mathematica will automatically find and load all the packages
as required to execute Descarta2D commands.
The package names are listed in Table 22.2. Each package defines symbols that are then
owned by the package. The definitions in each package provide either support for Descarta2D
objects (such as Point2D, Line2D, Circle2D, etc.) or functions (such as Radius2D[circle]
that returns the radius of a circle, or Line2D[point, point] that constructs a line between two
points).
338 Chapter 22 Technical Notes
Command Browser
This chapter is an alphabetical listing of all the commands provided by Descarta2D. The
syntax and usage of each command is described, as well as notes outlining special options
and defaults. Additionally, a cross-reference pointing to related commands is provided in each
section. Commands described as being low-level are used in the internal implementation of
Descarta2D. Low-level commands may be used freely, but they are not generally mentioned in
the subject matter chapters of the book. Page numbers enclosed in square brackets indicate
the page in the package listings where the implementation of the command is found.
Angle2D
Angle2D[line] computes the angle a line makes with the +x-axis, when measured
counter-clockwise from the +x-axis to the line. [460]
Apex2D
Apex2D is a keyword indicating the construction of the apex control point of a conic arc. [419]
341
342 Command Browser
Arc2D
Arc2D[{x0, y0 }, {x1 , y1 }, B] is the standard representation of an arc. The coordinates of
the start point are (x0 , y0 ) and the coordinates of the end point are (x1 , y1 ). The bulge
factor is the positive number B. The arc is traversed counter-clockwise from the start point
to the end point. [387]
The bulge factor, B, is the ratio of the arc’s height, h, to half the chord length,
d/2; so B = 2h/d.
Arc2D[{x0, y0 }, {x1 , y1 }, B][t] and arc[t] return the {x, y} coordinates of a
point at parameter t on an arc. Parameter values in the range 0 ≤ t ≤ 1 produce
coordinates covering the complete span of the arc. [388]
Arc2D[{x0, y0 }, {x1 , y1 }, B][{t1 , t2 }] produces graphics primitives for a
portion of an arc between parameters t1 and t2 when plotted. [388]
Arc2D[arc, Complement2D] constructs the complement of an arc. [391]
Arc2D[point, r, {θ1 , θ2 }] constructs an arc from the center point, radius and
span. The angles, θ1 and θ2 , are measured counter-clockwise from the
+x-axis. [392]
Arc2D[point, r, {point1 , point2 }] constructs an arc from the center point, radius
and the start and end points of the span. The start/end points do not need to lie
on the arc, although they cannot be coincident with the center. [393]
Arc2D[point, point, point] constructs an arc passing through three points. The
first and third points define the span of the arc. [393]
Arc2D[{point, θ}, point] constructs an arc from a start point with entry angle
and an end point. [392]
See also: Bulge2D, Complement2D.
ArcLength2D
ArcLength2D[curve, {t1 , t2 }] computes the arc length of a curve between two parameter
values.
The curve may be an arc [396], circle [396], ellipse [397], hyperbola [397], line [397],
line segment [397] or parabola [398].
N[ArcLength2D[cnarc, {t1 , t2 }]] numerically computes the arc length of a conic
arc between two parameter values. [396]
See also: Circumference2D, Length2D, Perimeter2D, Span2D.
Area2D
Area2D[curve] computes the area associated with a curve.
Command Browser 343
AskCurveLength2D
AskCurveLength2D[ ] is a low-level function that returns the value of the CurveLength2D
option of the Sketch2D command. [513]
Asymptotes2D
Asymptotes2D[hyperbola] constructs a list containing the two asymptote lines of a
hyperbola. [413]
Bulge2D
Bulge2D[arc] returns the bulge factor of an arc. [390]
Centroid2D
Centroid2D is a keyword indicating the construction of a triangle’s centroid point. [551]
ChopImaginary2D
ChopImaginary2D[expr, tol] is a low-level function that removes insignificant imaginary
parts of complex numbers in an expression. The imaginary part is considered insignificant if
its absolute value is less than the tolerance. [477]
Circle2D
Circle2D[{h, k}, r] is the standard representation of a circle. The coordinates of the center
point of the circle are {h, k} and the radius is r. [405]
344 Command Browser
Circle2D[{h, k}, r][θ] and circle[θ] return the {x, y} coordinates of a point at
parameter θ on a circle. Parameter values in the range 0 ≤ θ < 2π produce
coordinates covering the complete circumference of the circle. [406]
Circle2D[{h, k}, r][{θ1 , θ2 }] produces graphics primitives for the arc of the
circle between parameters θ1 and θ2 when plotted. [406]
Circle2D[arc] constructs the circle underlying an arc. [391]
Circle2D[circle, circle, k, Pencil2D] constructs a circle, parameterized by the
variable k, that represents the family (pencil) of circles passing through the
intersection points of the two given circles. The family of circles is valid even if
the two circles do not intersect as they will share a common radical axis. [486]
Circle2D[lnseg] constructs the circle whose diameter chord is a given line
segment. [509]
Circle2D[point, r] constructs the circle centered at a point with a given
radius. [409]
Circle2D[point, point] constructs the circle given a center point and a point on
the circle. [409]
Circle2D[point, point, point] constructs a circle through three points. [410]
Circle2D[point, line] constructs a circle with a given center point and tangent
to a line. [409]
Circle2D[quad] constructs the circle associated with a quadratic. [409]
Circle2D[triangle, Circumscribed2D] constructs a circle circumscribed about a
triangle. [553]
Circle2D[triangle, Inscribed2D] constructs a circle inscribed inside a
triangle. [553]
See also: Inscribed2D, Circumscribed2D, Pencil2D, TangentCircles2D.
Circumference2D
Circumference2D[circle] computes the circumference of a circle. [396]
Circumscribed2D
Circumscribed2D is a keyword indicating a construction involving a triangle’s circumscribed
circle. [552]
Complement2D
Complement2D is a keyword indicating the construction of an arc’s complement. [391]
ConicArc2D
ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ] is the standard representation of a conic arc.
The coordinates of the start point are {x0 , y0 }, the coordinates of the apex point are
{xA , yA } and the coordinates of the end point are {x1 , y1 }. The projective discriminant is
ρ. [415]
Conjugate2D
Conjugate2D is a keyword indicating the construction of a conjugate hyperbola. [450]
Coordinates2D
Coordinates2D[args..] returns the {x, y} coordinates of the point that would be returned
by the function Point2D[args..]. [490]
CurveLength2D
CurveLength2D is an option for the Sketch2D command specifying the approximate length
that an unbounded curve should be rendered when plotted. [512]
The initial default, if not specified, is 10. The default can by changed using the
Mathematica SetOptions command.
See also: AskCurveLength2D, Sketch2D.
346 Command Browser
CurveLimits2D
CurveLimits2D[coords, curve] is a low-level function that computes a list of two parameter
values on a curve such that the point whose coordinates are given is a distance
CurveLength2D/2 from the points on the curve at the parameter values. [513]
Directrices2D
Directrices2D[conic] returns a list of the directrix line(s) of a conic curve.
The conic may be an ellipse [413], hyperbola [413] or parabola [413]. If the conic is
an ellipse or hyperbola there are two directrix lines in the list; if the conic is a
parabola there is one directrix line in the list.
Distance2D
Distance2D[coords, coords] computes the distance between two positions given by
coordinates. [491]
Eccentricity2D
Eccentricity2D[conic] computes the eccentricity of a conic.
Ellipse2D
Ellipse2D[{h, k}, a, b, θ] is the standard representation of an ellipse. The coordinates of
the center point are {h, k}, the length of the semi-major axis is a, the length of the
semi-minor axis is b and the angle of rotation, counter-clockwise with respect to the +x-axis,
is θ. [421]
Ellipse2D[point, point, e] constructs an ellipse from two focus points and the
eccentricity. [426]
Ellipse2D[{point, point}, e] constructs an ellipse from two vertex points and
the eccentricity. [425]
Equation2D
Equation2D[line, {x, y}] returns the equation Ax + By + C == 0, which is the equation of
the line. [428]
FocalChords2D
FocalChords2D[conic] returns a list containing the focal chords of a conic curve (line
segments).
The conic may be an ellipse [414], hyperbola [414] or parabola [414]. If the conic is
an ellipse or hyperbola the list contains two focal chords (line segments); if the
conic is a parabola the list contains a single focal chord (line segment).
FocalLength2D
FocalLength2D[parabola] returns the focal length of a parabola. [481]
See also: Parabola2D.
Foci2D
Foci2D[conic] returns a list containing the focus point(s) of a conic.
The conic may be an ellipse [412], hyperbola [412] or parabola [412]. If the conic is
an ellipse or hyperbola the list contains two focus points; if the conic is a
parabola the list contains a single focus point.
Hyperbola2D
Hyperbola2D[{h, k}, a, b, θ] is the standard representation of a hyperbola. The
coordinates of the center point are {h, k}, the length of the semi-transverse axis is a, the
length of the semi-conjugate axis is b and the angle of rotation, counter-clockwise with
respect to the +x-axis, is θ. [445]
Hyperbola2D[{h, k}, a, b, θ][t] and hyperbola[t] return the {x, y} coordinates
of a point at parameter t on the primary branch of a hyperbola. Parameter
values in the range −∞ < t < +∞ cover the complete hyperbola branch. The
primary branch opens about the +x-axis when the angle of rotation is zero. [446]
348 Command Browser
Inscribed2D
Inscribed2D is a keyword indicating a construction involving a triangle’s inscribed
circle. [552]
See also: Circle2D, Point2D.
Is2D
Is2D[object, objHeadList] is a low-level function that returns True if the object is a valid
Descarta2D object and its head is included in the head list; otherwise, returns False. [472]
IsApproximate2D
IsApproximate2D[expr] is a low-level function that returns True if the expression contains
approximate real numbers; otherwise, returns False. [431]
The function will attempt to detect if the pending evaluation will eventually be
approximated using the N[expr] function. If this condition is detected the
function will also return True.
IsCoincident2D
IsCoincident2D[obj, obj] returns True if two objects are of the same type and are
coincident; otherwise, returns False. The objects may be circles, coordinates, lines, points
or quadratics. [439]
The function returns unevaluated if the two objects are of a different type.
Command Browser 349
IsCollinear2D
IsCollinear2D[point, point, point] returns True if three points are collinear; otherwise,
returns False. [440]
IsComplex2D
IsComplex2D[expr, tol] is a low-level function that returns True if the expression, when
evaluated, contains a complex number (a number is considered complex if the absolute value
of its imaginary part is greater than the tolerance); otherwise, returns False. [431]
IsConcentric2D
IsConcentric2D[circle, circle] returns True if two circles are concentric; otherwise, returns
False. [440]
IsConcurrent2D
IsConcurrent2D[line, line, line] returns True if three lines are concurrent (intersect in a
common point); otherwise, returns False. [441]
IsDisplay2D
IsDisplay2D[object] is a low-level function that returns True if the object is a displayable
Descarta2D object; otherwise, returns False. [512]
350 Command Browser
IsNegative2D
IsNegative2D[expr, tol] is a low-level function that returns True if the expression, when
evaluated, is negative (a number is considered negative if it is less than zero and its absolute
value is greater than the tolerance); otherwise, returns False. [434]
IsNumeric2D
IsNumeric2D[expr, tol] is a low-level function that returns True if all the atoms in an
expression can be evaluated to real numbers (a complex number is considered real if the
absolute value of its imaginary part is less than the tolerance); otherwise, returns False. [432]
IsOn2D
IsOn2D[point, curve] returns True if a point is on a curve; otherwise, returns False.
IsParallel2D
IsParallel2D[line, line] returns True if two lines are parallel; otherwise, returns
False. [442]
IsPerpendicular2D
IsPerpendicular2D[line, line] returns True if two lines are perpendicular; otherwise,
returns False. [442]
IsReal2D
IsReal2D[expr, tol] is a low-level function that returns True if the expression, when
evaluated, is a real number (a complex number is considered real if the absolute value of its
imaginary part is less than the tolerance); otherwise, returns False. [433]
IsScalar2D
IsScalar2D[expr] is a low-level function that returns True if the expression appears to be a
scalar quantity—that is, it cannot be recognized as a list, a complex number or a Descarta2D
object; otherwise, returns False. [433]
IsScalarPair2D
IsScalarPair2D[{expr, expr}] is a low-level function that returns True if both expressions
appear to be scalar quantities—that is, they cannot be recognized as lists, complex numbers
or Descarta2D objects; otherwise, returns False. [434]
IsTangent2D
IsTangent2D[line, circle] returns True if a line is tangent to a circle; otherwise, returns
False. [443]
IsTangent2D[circle, circle] returns True if two circles are tangent to each other;
otherwise, returns False. [443]
IsTinyImaginary2D
IsTinyImaginary2D[expr, tol] is a low-level function that returns True if any complex
number in an expression has a tiny imaginary part (the imaginary part is considered tiny if
its absolute value is less than the tolerance); otherwise, returns False. [434]
IsTripleParallel2D
IsTripleParallel2D[line, line, line] returns True if three lines are mutually parallel;
otherwise, returns False. [442]
IsValid2D
IsValid2D[object] is a low-level function that returns True if the object is syntactically
valid; otherwise, returns False. [472]
The object may be an arc [389], circle [406], conic arc [417], ellipse [423],
hyperbola [447], line [459], line segment [506], parabola [481], point [490],
quadratic [498] or triangle [546].
IsZero2D
IsZero2D[expr, tol] is a low-level function that returns True if the expression, when
evaluated, is zero (a number is considered zero if its absolute value is less than the
tolerance); otherwise, returns False. [435]
IsZeroOrNegative2D
IsZeroOrNegative2D[expr, tol] returns True if the expression, when evaluated, is zero or
negative; otherwise, returns False. [435]
Length2D
Length2D[lnseg] computes the length of a line segment. [507]
Line2D
Line2D[A, B, C] is the standard representation of the line Ax + By + C = 0. [458]
Loci2D
Loci2D[quad] returns a list of objects represented by a quadratic. The list may contain a
conic, one or two lines, a point or it may be empty. [465]
Loci2D[cnarc] returns a list containing the curve underlying a conic arc. [419]
Loci2D[point, length, e] returns a list containing the conic defined by the vertex
equation parameters. The point is the vertex point, the length is the focal length
and the constant, e, is the eccentricity. The conic is constructed in standard
position. [468]
Command Browser 355
MakePrimitives2D
MakePrimitives2D[curve, {t1 , t2 }] is a low-level function that returns a list of
Mathematica graphics primitives approximating a curve between two parameter values. [513]
The curve may be an arc, circle, conic arc, ellipse, hyperbola, line, line segment
or parabola.
MaxSeconds2D
MaxSeconds2D is a keyword indicating the maximum number of seconds allowed for solving
equations. [516]
See also: Solve2D.
MedialEquations2D
MedialEquations2D[{obj, obj}] returns a list of lines or quadratics equidistant from two
given objects. The given objects may be points, lines or circles. [473]
See also: MedialLoci2D.
MedialLoci2D
MedialLoci2D[{obj, obj}] returns a list of objects equidistant from two given objects. The
given objects may be points, lines or circles. [474]
See also: MedialEquations2D.
ObjectNames2D
ObjectNames2D[ ] returns a list of strings which are the names of all the Descarta2D
objects. [472]
Parabola2D
Parabola2D[{h, k}, f, θ] is the standard representation of a parabola. The coordinates of
the vertex point are {h, k}, the focal length is f and the angle of rotation, counter-clockwise
with respect to the +x-axis, is θ. [479]
Parabola2D[{h, k}, f, θ][t] and parabola[t] return the {x, y} coordinates of a
point at parameter t on a parabola. Parameter values in the range
−∞ < t < +∞ produce coordinates covering the complete parabola. [480]
356 Command Browser
Parallel2D
Parallel2D is a keyword indicating a parallel construction. [463]
Parameters2D
Parameters2D[line, curve] computes a list of the two parameters where a line intersects a
curve.
The curve may be a circle [455], ellipse [455], hyperbola [455] or parabola [456].
The list of parameters is useful for computing areas and arc lengths defined by
the line and the curve.
See also: ArcLength2D, SectorArea2D, SegmentArea2D.
Pencil2D
Pencil2D is a keyword indicating the construction of a pencil of curves. [485]
Perimeter2D
Perimeter2D[triangle] computes the perimeter of a triangle. [398]
Perpendicular2D
Perpendicular2D is a keyword indicating a perpendicular construction. [463]
Point2D
Point2D[{x, y}] or Point2D[coords] is the standard representation of a point with
coordinates {x, y}. [489]
Points2D
Points2D[curve, curve] constructs a list containing the intersection points of two
curves. [453]
The curves may be lines, circles, ellipses, hyperbolas, parabolas or quadratics.
Polynomial2D
Polynomial2D[line, {x, y}] returns the polynomial Ax + By + C, which is the polynomial
of the line. [428]
PrimaryAngle2D
PrimaryAngle2D[θ] returns a primary angle in the range 0 ≤ φ < 2π where
φ =Mod[θ, 2π]. [478]
PrimaryAngle2D[θ, 2π] returns a primary angle in the range 0 ≤ φ < 2π where
φ is given by Mod[θ, 2π]. [478]
PrimaryAngle2D[θ, π] returns a primary angle in the range 0 ≤ φ < π where φ
is given by Mod[θ, π]. [478]
See also: PrimaryAngleRange2D.
PrimaryAngleRange2D
PrimaryAngleRange2D[{θ1, θ2 }] returns a list of two primary angles, {φ1 , φ2 }, such that
0 ≤ φ1 < 2π and φ1 < φ2 < (φ1 + 2π). [478]
Quadratic2D
Quadratic2D[A, B, C, D, E, F] is the standard representation of the quadratic given by
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0. [497]
Quadratic2D[cnarc] constructs the quadratic underlying a conic arc. [416]
Quadratic2D[conic] constructs the quadratic associated with a conic. The conic
may be a circle [405], ellipse [422], hyperbola [446] or parabola [480].
Quadratic2D[coords] constructs the quadratic representing a position specified
by coordinates (a circle of zero radius). [500]
Command Browser 359
Radius2D
Radius2D[circle] returns the radius of a circle. [407]
Radius2D[arc] returns the radius of an arc. [390]
See also: Arc2D, Circle2D.
360 Command Browser
Reflect2D
Reflect2D[object, line] reflects an object in a line.
The object may be an arc [390], circle [407], conic arc [418], coordinates [540],
ellipse [424], hyperbola [448], line [461], line segment [507], parabola [481],
point [492] or triangle [550].
Reflect2D[objList, line] reflects a list of objects in a line, returning a list of
objects. [540]
Reflect2D[eqn, {x, y}, line] reflects an equation in a line. [540]
The equation may be linear, Ax + By + C == 0, or quadratic,
Ax2 + Bxy + Cy 2 + Dx + Ey + F == 0. [540]
See also: ReflectAngle2D, Rotate2D, Scale2D, Translate2D.
ReflectAngle2D
ReflectAngle2D[θ, line] computes the reflection of an angle in a line. [540]
If a line L makes an angle θ with the +x-axis and line L0 is the reflection of L in
the given line (the second argument to the function), then the function computes
the angle θ0 that L0 makes with the +x-axis.
See also: Reflect2D.
Rho2D
Rho2D[cnarc] returns the projective discriminant of a conic arc. [417]
Rotate2D
Rotate2D[object, θ, coords] rotates an object by an angle θ (in radians) about a position
whose coordinates are given. If the coordinates are omitted, the default is the origin.
The object may be an arc [389], circle [407], conic arc [418], coordinates [541],
ellipse [424], hyperbola [448], line [461], line segment [507], parabola [482] or
triangle [551].
Rotate2D[objList, θ, coords] rotates a list of objects. [541]
Rotate2D[eqn, {x, y}, θ, coords] rotates an equation by an angle θ (in radians)
about a position whose coordinates are given. [541]
The equation may be linear, Ax + By + C == 0, or quadratic,
Ax2 + Bxy + Cy 2 + Dx + Ey + F == 0. [541]
See also: Reflect2D, Scale2D, Translate2D.
Command Browser 361
Scale2D
Scale2D[object, s, coords] scales an object from a position given as coordinates. If the
coordinates are omitted, the default is the origin. [541]
The object may be an arc [391], circle [407], conic arc [418], coordinates [542],
ellipse [424], hyperbola [449], line [461], line segment [507], parabola [482] or
triangle [551].
Scale2D[objList, s, coords] scales a list of objects from a position whose
coordinates are given. [542]
Scale2D[eqn, {x, y}, s, coords] scales an equation from a position. [542]
The equation may be linear, Ax + By + C == 0, or quadratic,
Ax2 + Bxy + Cy 2 + Dx + Ey + F == 0. [542]
See also: Reflect2D, Rotate2D, Translate2D.
SectorArea2D
SectorArea2D[curve, {t1 , t2 }] computes the area of a sector of a curve between two
parameters.
The curve may be a circle [400], ellipse [401] or hyperbola [402] (the sector is
defined from the center point of the curve to the two points defined by the
parameters on the curve).
See also: Area2D, SegmentArea2D.
Segment2D
Segment2D[{x0, y0 }, {x1 , y1 }] is the standard representation of a line segment. The
coordinates of the start point are {x0 , y0 } and the coordinates of the end point are
{x1 , y1 }. [505]
SegmentArea2D
SegmentArea2D[curve, {t1 , t2 }] computes the area of a segment of a curve between two
parameters.
362 Command Browser
The curve may be a circle [400], ellipse [401], hyperbola [402] or parabola [402]
(the segment is the area between the curve and the chord defined by the two
parameters).
See also: Area2D, SectorArea2D.
SemiConjugateAxis2D
SemiConjugateAxis2D[hyperbola] returns the length of the semi-conjugate axis of a
hyperbola. [448]
See also: Hyperbola2D, SemiTransverseAxis2D.
SemiMajorAxis2D
SemiMajorAxis2D[ellipse] returns the length of the semi-major axis of an ellipse. [423]
See also: Ellipse2D, SemiMinorAxis2D.
SemiMinorAxis2D
SemiMinorAxis2D[ellipse] returns the length of the semi-minor axis of an ellipse. [423]
See also: Ellipse2D, SemiMajorAxis2D.
SemiTransverseAxis2D
SemiTransverseAxis2D[hyperbola] returns the length of the semi-transverse axis of a
hyperbola. [448]
See also: Hyperbola2D, SemiConjugateAxis2D.
SetDisplay2D
SetDisplay2D[objPatt, objPrim] is a low-level function that specifies the graphics
primitives to use when plotting a given object pattern. [513]
SimplifyCoefficients2D
SimplifyCoefficients2D[coefList] is a low-level function that returns a list of coefficients
with common factors removed. [427]
Simplify[line] and FullSimplify[line] use SimplifyCoefficients2D to
simplify the coefficients of a line.
Simplify[quad] and FullSimplify[quad] use SimplifyCoefficients2D to
simplify the coefficients of a quadratic.
Sketch2D
Sketch2D[objList, opts] produces a plot of the objects in a list. [513]
Command Browser 363
The list of objects may be nested. Any of the options for the Mathematica
Graphics command may be specified.
Sketch2D[objList, CurveLength2D->n, opts] produces a plot of the objects in a
list, using a specified curve length for unbounded curves. [513]
See also: AskCurveLength2D, CurveLength2D.
Slope2D
Slope2D[line] computes the slope of a line. [460]
Solve2D
Solve2D[eqnList, varList] is a low-level function that solves a list of equations for a list of
variables and returns a list of rules representing the solutions. [516]
SolveTriangle2D
SolveTriangle2D[{{s1, s2 , s3 }, {a1 , a2 , a3 }}] computes a triangle configuration from
three sides and/or angles. Unspecified arguments should be Null. [548]
Span2D
Span2D[arc] computes the arc length of the complete span of an arc. [395]
TangentCircles2D
TangentCircles2D[{pt | ln | cir, pt | ln | cir, pt | ln | cir}] constructs a list of circles tangent
to three objects (points, lines or circles). [522]
364 Command Browser
TangentConics2D
TangentConics2D[{pt | ln, pt | ln, pt | ln, pt | ln, pt | ln}] constructs a list of conics tangent
to five objects (points or lines). [526]
The expressions in the resulting conics can be very complicated and are usually
practical only if evaluated numerically.
See also: TangentQuadratics2D.
TangentEquation2D
TangentEquation2D[line, quad] returns an equation involving the coefficients of a line and
a quadratic that constrains the two curves to be tangent. [532]
TangentLines2D
TangentLines2D[curve, curve] constructs a list of lines tangent to two curves. [533]
The curves may be circles, ellipses, hyperbolas, parabolas or quadratics.
TangentLines2D[line, curve] constructs a list of lines parallel to a line and
tangent to a curve. [532]
TangentLines2D[line, curve, Parallel2D] also constructs a list of lines parallel
to a line and tangent to a curve. [532]
TangentLines2D[line, curve, Perpendicular2D] also constructs a list of lines
perpendicular to a line and tangent to a curve. [532]
TangentLines2D[point, curve] constructs a list of lines from a point and tangent
to a curve. [532]
See also: Parallel2D, Perpendicular2D, TangentSegments2D.
Command Browser 365
TangentPoints2D
TangentPoints2D[point, curve] constructs a list of points that are the points of tangency of
lines from a point to a curve. [537]
TangentQuadratics2D
TangentQuadratics2D[{pt | ln, pt | ln, pt | ln, pt | ln, pt | ln}] constructs a list of quadratics
tangent to five objects (points or lines). [526]
The expressions in the resulting quadratics can be very complicated and are
usually practical only if evaluated numerically.
See also: TangentConics2D.
TangentSegments2D
TangentSegments2D[curve, curve] constructs a list of line segments tangent to two
curves. [534]
Translate2D
Translate2D[object, {u, v}] translates an object delta distance.
The object may be an arc [391], circle [408], conic arc [418], coordinates [542],
ellipse [424], hyperbola [449], line [461], line segment [508], parabola [482],
quadratic [499] or triangle [551].
Translate2D[objList, {u, v}] translates a list of objects. [543]
Translate2D[eqn, {x, y}, {u, v}] translates an equation delta distance. [543]
The equation may be linear, Ax + By + C == 0, or quadratic,
Ax2 + Bxy + Cy 2 + Dx + Ey + F == 0. [543]
See also: Reflect2D, Rotate2D, Scale2D.
Triangle2D
Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }] is the standard representation of a triangle
defined by three vertex coordinates. [546]
Vertices2D
Vertices2D[conic] returns a list containing the vertex point(s) of a conic curve.
The conic may be an ellipse [412], hyperbola [413] or parabola [413]. If the conic is
an ellipse or hyperbola the list contains two vertex points; if the conic is a
parabola the list contains a single vertex point.
XCoordinate2D
XCoordinate2D[point] returns the x-coordinate of a point. [491]
YCoordinate2D
YCoordinate2D[point] returns the y-coordinate of a point. [491]
Error Messages
This chapter is a listing of all the error messages that can be generated by Descarta2D during
computations. Mathematica may generate additional error messages. The messages are listed
alphabetically by message name. The number in square brackets indicates the page where the
error is defined in the packages.
Arc2D
Arc2D::collinear .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [393]
No arc exists; the given points {pt1 , pt2 , pt3 } are collinear.
When specifying an arc through three points, the points cannot be collinear. Descarta2D will
return the $Failed symbol if it detects that the three specified points lie on a line.
—–
Arc2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [388]
An invalid arc of the form arc1 has been detected; the arguments cannot
be imaginary.
The arguments of an arc cannot involve imaginary numbers. Descarta2D will return the
$Failed symbol whenever the arguments of an object are determined to be invalid.
—–
Arc2D::invalid.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[389]
An invalid arc of the form arc has been detected; the bulge factor must
be positive and the defining points must be distinct.
The bounding points of an arc cannot be coincident and the bulge factor must be positive.
Descarta2D will return the $Failed symbol whenever the arguments of an object are deter-
mined to be invalid.
—–
367
368 Error Messages
Arc2D::invalidCoincident .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[392]
The defining points are coincident; an arc cannot be constructed.
The defining points of an arc must be distinct. Descarta2D will return the $Failed symbol if
coincident points are detected.
—–
Arc2D::invalidCollinear .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [393]
The three defining points are collinear; an arc cannot be constructed.
An arc cannot be constructed through three collinear points. Descarta2D will return the
$Failed symbol if collinear points are detected.
—–
Arc2D::invalidEntryAngle .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[392]
The entry angle of the arc is invalid; the entry angle cannot be an
integer multiple of Pi radians.
The entry angle of an arc cannot be an integer multiple of π radians. Descarta2D will return
the $Failed symbol if invalid entry angle is detected.
—–
Arc2D::invalidRadius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [392]
The radius, r, of the arc is invalid; the radius must be positive.
The radius of an arc must be positive. Descarta2D will return the $Failed symbol if a non-
positive radius is detected.
—–
Arc2D::invalidSpan .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [392]
The angular span of the arc is invalid; the span cannot be an integer
multiple of 2Pi radians.
The angular span of an arc cannot be a multiple of 2π radians. The $Failed symbol will be
returned when an invalid span is specified.
—–
Circle2D
Circle2D::coincident . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [409]
The points {pt1 , pt2 } are coincident; no valid circle exists.
Error Messages 369
When specifying a circle by two points, the points cannot be coincident. Descarta2D will
return the $Failed symbol if two coincident points are specified.
—–
Circle2D::collinear.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[410]
The points {pt1 , pt2 , pt3 } are collinear; no valid circle exists.
When specifying a circle through three points, the points cannot be collinear. Descarta2D will
return the $Failed symbol if it detects that the three specified points lie on a line.
—–
Circle2D::imaginary.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[406]
An invalid circle of the form cir1 has been detected; the arguments cannot
be imaginary.
The arguments defining a circle cannot be imaginary numbers. Descarta2D will return the
$Failed symbol if the arguments of an object involve imaginary numbers.
—–
Circle2D::invalid .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [406]
An invalid circle of the form cir1 has been detected; the radius must be
positive.
When defining a circle the radius must be a positive number. Descarta2D will return the
$Failed symbol whenever the arguments to an object are determined to be invalid.
—–
Circle2D::noCircle .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [409]
The curve represented by quad1 is not a circle.
Descarta2D has detected that the curve represented by a Quadratic2D is not a circle. The
$Failed symbol will be returned.
—–
Circle2D::on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [409]
pt1 is on ln1 ; no valid circle exists.
When specifying a circle tangent to a line with a given center point, the point cannot be on the
line. If Descarta2D detects that the point lies on the line, it will return the $Failed symbol.
—–
Circle2D::radius .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [409]
The radius argument, r, is invalid; the radius must be positive.
When specifying a circle by center point and radius, the radius must be positive. Descarta2D
will return the $Failed symbol if a non-positive radius is specified during a circle construction.
—–
370 Error Messages
ConicArc2D
ConicArc2D::center .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [419]
The chord defined by ln1 passes through the center of crv1 ; a conic arc
cannot be constructed.
The chord of a conic arc cannot pass through the center of a central conic because this
configuration is invalid. If the line defining the chord passes through the center of the conic,
then the $Failed symbol will be returned.
—–
ConicArc2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [416]
An invalid conic arc of the form cnarc1 has been detected; the arguments
cannot be imaginary.
The arguments defining a conic arc cannot be imaginary. If Descarta2D detects an invalid
object the $Failed symbol will be returned.
—–
ConicArc2D::noChord.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[419]
No chord exists between ln1 and crv1 ; a conic arc cannot be constructed.
When constructing a conic arc from a line and a conic curve, the line must intersect the conic
in two points that form the chord of the conic arc. If the intersection consists of less than two
points, or it is on opposite branches of a hyperbola, then the $Failed symbol will be returned.
—–
ConicArc2D::points .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [417]
An invalid conic arc of the form cnarc1 has been detected; the control
points cannot be collinear.
The three control points defining a conic arc cannot be collinear. Descarta2D will return the
$Failed symbol whenever the arguments to an object are determined to be invalid.
—–
ConicArc2D::rho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [417]
An invalid conic arc of the form cnarc1 has been detected; the value of
rho must be in the range 0<rho<1.
The value of ρ determines the shape and type of the conic arc. When 0 < ρ < 1/2 an elliptic
conic arc is created, when ρ = 1/2 a parabolic conic arc is created and when 1/2 < ρ < 1 a
hyperbolic conic arc is created. Descarta2D will return the $Failed symbol whenever the
arguments to an object are determined to be invalid.
—–
Error Messages 371
D2DExpressions2D
D2DExpressions2D:badTol .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [431]
The tolerance tol is not a valid tolerance specification; the default
tolerance, 10−10 , will be used.
Tolerance values used to query expressions must be numbers greater than or equal to zero.
—–
D2DMaster$2D
D2DMaster$2D::loaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [469]
The package ‘D2DMaster2D’ has already been loaded.
The package D2DMaster2D.m defines the symbol names associated with each Descarta2D pack-
age so that it can be loaded automatically when referenced. This file only needs to be loaded
once; subsequent requests to load the file will be ignored and will cause no harm.
—–
D2DMaster$2D::noPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [469]
The path to ’D2DMaster2D.m’ cannot be found; unable to initialize
Descarta2D.
The package D2DMaster2D.m defines the symbol names associated with each Descarta2D pack-
age so that it can be loaded automatically when referenced. This error indicates that the
software has not been installed correctly.
—–
D2DMaster$2D::tooManyPaths .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [469]
More than one path to ’D2DMaster2D.m’ was found; using path-name.
The package D2DMaster2D.m defines the symbol names associated with each Descarta2D pack-
age so that they can be loaded automatically when referenced. This error indicates that the
software has found more than one copy of this file and may suggest that the software has not
been installed correctly.
—–
Directrices2D
Directrices2D::circular .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [413]
The ellipse ellipse1 is circular; it has no (finite) directrix lines.
An ellipse whose semi-major and semi-minor axes are equal in length has no (finite) directrix
lines. Descarta2D will return an empty list.
—–
372 Error Messages
Ellipse2D
Ellipse2D::imaginary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [422]
An invalid ellipse of the form ellipse1 has been detected; the arguments of
an ellipse cannot involve imaginary numbers.
When constructing an ellipse Descarta2D verifies that none of the arguments involve imaginary
numbers. Descarta2D will return the $Failed symbol whenever the arguments to an object
are determined to be invalid.
—–
Ellipse2D::invalid .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [423]
An invalid ellipse of the form ellipse1 has been detected; the length of
both the semi-major and semi-minor axes must be positive.
When constructing an ellipse Descarta2D verifies that both the semi-major and semi-minor
axes have positive lengths. Descarta2D will return the $Failed symbol whenever the argu-
ments to an object are determined to be invalid.
—–
Ellipse2D::invdef .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [425]
The defining geometry or eccentricity is invalid; the eccentricity of an
ellipse must be in the range 0<e<1, the foci and vertices cannot be
coincident, and the focus cannot lie on the directrix.
An invalid ellipse was specified and Descarta2D will return the $Failed symbol.
—–
Hyperbola2D
Hyperbola2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [447]
An invalid hyperbola of the form hyp1 has been detected; the arguments
cannot be imaginary.
Hyperbola2D::invalid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [447]
An invalid hyperbola of the form hyp1 has been detected; the lengths of
the semi-transverse and semi-conjugate axes must be positive.
Error Messages 373
When constructing a hyperbola the lengths of both the semi-transverse and the semi-conjugate
axes must be positive. Descarta2D will return the $Failed symbol whenever the arguments
to an object are determined to be invalid.
—–
Hyperbola2D::invdef.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[450]
The defining geometry or eccentricity is invalid; the eccentricity of a
hyperbola must be greater than 1, the foci and vertices cannot be coincident
and the focus cannot lie on the directrix.
An invalid hyperbola was specified and Descarta2D will return the $Failed symbol.
—–
IsNumeric2D
IsNumeric2D:notNumeric .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [432]
The funcName function requires numerical arguments; symbolic arguments
are not allowed.
Some Descarta2D functions require that their arguments be numeric. These functions will not
allow symbolic arguments.
—–
Line2D
Line2D::concentric .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [408]
The circles {cir1 , cir2 } are concentric; no radical axis exists.
When specifying the two circles for the construction of a radical axis, the two circles cannot
be concentric. If Descarta2D detects that concentric circles have been specified in the radical
axis construction, it will return the $Failed symbol.
—–
Line2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [459]
An invalid line of the form ln1 has been detected; the arguments cannot
be imaginary.
The arguments defining a line cannot be imaginary. If Descarta2D detects that an object is
invalid the $Failed symbol will be returned.
—–
Line2D::invalid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [459]
An invalid line of the form ln1 has been detected; at least one of the
first two coefficients must be non-zero.
374 Error Messages
When defining a line at least one of the first two coefficients, A or B, must be non-zero.
Descarta2D will return the $Failed symbol whenever the arguments to an object are deter-
mined to be invalid.
—–
Line2D::noPolar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [463]
Since pt1 is at the center of the conic, no polar line exists.
When creating the polar line of a quadratic with respect to a point, Descarta2D verifies that
the point is not coincident with the center of the conic curve represented by the quadratic.
If the point is at the center of the conic represented by the quadratic Descarta2D returns the
$Failed symbol.
—–
Line2D::noPoly.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[458]
The expression expr cannot be recognized as a linear polynomial or
equation in variables x and y.
When converting a polynomial or equation to a line, the expression representing the line
must be recognizable as a linear polynomial or equation. If the expression is not recognizable
Descarta2D returns the $Failed symbol.
—–
Line2D::sameCoords .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [462]
The coordinates {x1 , y1 } and {x2 , y2 } are coincident; no valid line can be
constructed.
When creating a line through a pair of coordinates or a pair of points, the positions cannot
be coincident. Descarta2D will return the $Failed symbol if it detects the coordinates are
coincident.
—–
Loci2D
Loci2D::central . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [465]
The quadratic is a central conic, but its type cannot be determined.
Due to the nature of the coefficients of the quadratic, the specific conic type cannot be deter-
mined; an empty list will be returned.
—–
Loci2D::eccentricity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [468]
The eccentricity, e, is invalid; the eccentricity must be positive.
Error Messages 375
The eccentricity of a conic must be positive; the $Failed symbol will be returned.
—–
Loci2D::noLocus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [465]
The quadratic has no real locus.
The equation represented by the quadratic has no real points; an empty list will be returned.
—–
MedialEquations2D
MedialEquations2D::coincident .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[473]
The objects {obj1 , obj2 } are coincident; no finite number of medial curves
exist.
When two objects are identical the medial points include all the points in the plane and no
unique curve locus exists. When this situation occurs Descarta2D will return an empty list
indicating that no unique curves satisfy the geometric constraints specified.
—–
Parabola2D
Parabola2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [480]
An invalid parabola of the form parabola1 has been detected; the arguments
cannot be imaginary.
The arguments of a parabola cannot be imaginary. Descarta2D will return the $Failed symbol
whenever the arguments to an object are determined to be invalid.
—–
Parabola2D::invalid.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[480]
An invalid parabola of the form parabola1 has been detected; the focal
length cannot be zero.
The focal length, f , of a parabola cannot be zero. Descarta2D will return the $Failed symbol
whenever the arguments to an object are determined to be invalid.
—–
Parabola2D::invptln.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[483]
The focus pt1 is on the directrix ln1 ; no valid parabola can be
constructed.
The focus point of a parabola cannot be on the directrix line. Descarta2D returns the $Failed
symbol when it detects an invalid construction.
—–
376 Error Messages
Parameters2D
Parameters2D::noChord .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [455]
No chord exists between ln1 and crv2 .
The Parameters2D function requires that the defining line intersect the curve in two points.
If the line does not intersect the chord, Descarta2D will return the $Failed symbol.
—–
Point2D
Point2D::coincident.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[494]
No unique intersection point exists; lines ln1 and ln2 are coincident.
Coincident lines cannot be intersected. Descarta2D will return the $Failed symbol if it detects
an attempt to intersect coincident lines.
—–
Point2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [490]
An invalid point of the form pt1 has been detected; the coordinates of a
point cannot be imaginary.
The coordinates of a point cannot be imaginary. If Descarta2D detects an invalid object the
$Failed symbol will be returned.
—–
Point2D::noDir.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[493]
Points {pt1 , pt2 } are coincident and do not define a valid direction.
When defining a point that is offset in a direction specified by two points, the direction points
cannot be coincident. Descarta2D returns the $Failed symbol if the two points are coincident.
—–
Point2D::noPole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [494]
Since ln1 passes through the center of the conic, no pole point exists.
When creating the pole point of a quadratic with respect to a line, Descarta2D verifies that
the line does not pass through the center of the conic curve represented by the quadratic. If
the line does pass through the center Descarta2D returns the $Failed symbol.
—–
Point2D::noRatio .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [493]
The sum of the ratio numbers {r1 , r2 } cannot be zero.
Error Messages 377
When defining a point that divides a segment into a given ratio, the ratio numbers r1 and
r2 cannot sum to zero. Descarta2D will return the $Failed symbol if the ratio numbers are
invalid.
—–
Point2D::notCentral.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[494]
quad is not a central conic; it has no center point.
The quadratic is not a central conic and has no center point. Descarta2D will return the
$Failed symbol.
—–
Point2D::notCentral1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [419]
The conic underlying cnarc is not a central conic; it has no center
point.
The conic underlying a conic arc is not a central conic and has no center point. Descarta2D
will return the $Failed symbol.
—–
Point2D::parallel .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [494]
No intersection point exists; lines ln1 and ln2 are parallel.
Parallel lines cannot be intersected. Descarta2D will return the $Failed symbol if its detects
an attempt to intersect parallel lines.
—–
Quadratic2D
Quadratic2D::coincident .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [487]
Two or more of the points are coincident; no valid quadratic pencil
exists.
When constructing a quadratic pencil from four points, no pair of points may be coincident.
The $Failed symbol with be returned if any pair of points is detected to be coincident.
—–
Quadratic2D::eccentricity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [502]
The eccentricity e is invalid; the eccentricity must be positive.
When defining a quadratic using a point, a line and an eccentricity, Descarta2D will report an
error if the eccentricity is not positive and return the $Failed symbol.
—–
378 Error Messages
Quadratic2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [461]
An invalid quadratic of the form quad1 has been detected; the arguments
cannot be imaginary.
The arguments defining a quadratic cannot be imaginary. If Descarta2D detects that an object
is invalid the $Failed symbol will be returned.
—–
Quadratic2D::invalid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [498]
An invalid quadratic of the form quad1 has been detected; at least one of
the first five coefficients must be non-zero.
At least one of the first five coefficients of a quadratic must be non-zero. The $Failed symbol
is returned whenever the arguments to an object are determined to be invalid.
—–
Quadratic2D::invEcc.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[499]
A negative eccentricity, expr1 , is invalid; no valid quadratic can be
constructed.
The eccentricity of a conic must be non-negative. Descarta2D will return the $Failed symbol
if an invalid eccentricity is specified.
—–
Quadratic2D::invLen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[499]
A non-positive focal chord length, expr1 , is invalid; no valid quadratic
can be constructed.
The length of a conic’s focal chord must be positive. Descarta2D will return the $Failed
symbol if an invalid length is specified.
—–
Quadratic2D::noPoly.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[500]
The expression expr cannot be recognized as a quadratic polynomial or
equation in variables x and y.
Segment2D
Segment2D::imaginary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [506]
An invalid line segment of the form lnseg1 has been detected; the
arguments cannot be imaginary.
A line segment with imaginary arguments has been detected. Descarta2D will return the
$Failed symbol whenever the arguments to an object are determined to be invalid.
—–
Segment2D::invalid .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [506]
An invalid line segment of the form lnseg1 has been detected; the defining
coordinates cannot be coincident.
In order to be valid, a line segment must have two distinct end points, they cannot be coin-
cident. Descarta2D will return the $Failed symbol whenever the arguments to an object are
determined to be invalid.
—–
Sketch2D
Sketch2D::invalidLength .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [512]
Setting CurveLength2D→ n1 is invalid; ‘CurveLength2D’ must be positive;
the current value of CurveLength2D→ n2 will be retained.
When using the Mathematica SetOptions command, any attempt to set the CurveLength2D
parameter of the Sketch2D function to a non-positive value will be rejected. The current value
of the CurveLength2D parameter will be retained.
—–
Sketch2D::noObj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [513]
No valid objects to sketch.
If there are no valid geometric objects in the list of objects to sketch, Descarta2D will output
the Sketch2D::noObj message to indicate no graphical output will be plotted.
—–
Sketch2D::notReal .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [513]
n object(s) cannot be sketched.
When plotting objects using the Sketch2D command, Descarta2D will count the number of
objects that have symbolic arguments. Such objects cannot be plotted and will not be included
in the graphics that are displayed.
—–
380 Error Messages
Solve2D
Solve2D::infinite .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [516]
An infinite number of solutions exist; only independent solutions will be
returned.
When solving a system of equations some solutions may exist in which the solutions are
interrelated functions of each other. Such solutions will not be returned.
—–
Solve2D::invalidTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [516]
Option MaxSeconds2D->n1 is invalid; ’MaxSeconds2D’ must be positive; the
current value of MaxSeconds2D->n2 will be retained.
When setting the MaxSeconds2D option of the Solve2D command, the option value must be
positive.
—–
Solve2D::time .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [516]
The equations could not be solved in MaxSeconds2D->n1, an empty list of
solutions will be returned; using approximate numbers may produce a more
complete list of solutions.
Some equations are too complex to be solved in the time allowed by the Descarta2D Solve2D
command. An empty list of solutions will be returned if the maximum time elapses before a
solution is found. To increase the maximum time allowed use the SetOptions command. For
example,
SetOptions[Solve2D, MaxSeconds2D->60].
SolveTriangle2D
SolveTriangle2D::ambiguous .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [550]
Two valid solutions exist for this configuration; set the alternate
solution option to logical to compute the other configuration.
When computing a triangle configuration, Descarta2D will display this warning if more than
one solution is valid. The logical will either be True or False indicating the setting required
to produce the alternate configuration.
—–
Error Messages 381
SolveTriangle2D::anglesOnly .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [549]
The triangle configuration is under-constrained; a valid configuration
with the triangle’s perimeter arbitrarily set to 1 will be computed.
When computing a triangle configuration consisting of angles only, Descarta2D will display
this warning to indicate that the length of the sides are arbitrarily set, being correct for the
given angles.
—–
SolveTriangle2D::constrain .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [548]
The triangle configuration is under-constrained; three constraints are
expected.
At least three parameters are needed to compute a triangle configuration. Descarta2D will
return $Failed if a configuration is under-constrained.
—–
SolveTriangle2D::invConfig .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [547]
The configuration of sides and/or angles specified is invalid; no
triangle can be constructed.
An invalid triangle configuration has been specified. Descarta2D will return $Failed.
—–
TangentConics2D
TangentConics2D::coincident .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
Two or more of the defining points or lines are coincident; no proper
conic can be constructed.
When constructing a tangent conic from defining points, all of the points must be unique; if
any of the points are coincident, Descarta2D will return an empty list.
—–
TangentConics2D::collinear .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
Three or more of the defining points are collinear; no proper conic can
be constructed.
When constructing a tangent conic from defining points, no triple of three points may be
collinear; if any triple is collinear Descarta2D will return an empty list.
—–
382 Error Messages
TangentConics2D::concurrent .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
Three or more of the tangent lines are concurrent; no proper conic can be
constructed.
When constructing a tangent conic from defining lines, no triple of lines can be concurrent
(meet in a point); if any triple is concurrent Descarta2D will return an empty list.
—–
TangentConics2D::linesThru .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
One of the points is on more than one of the tangent lines; no proper
conic can be constructed.
When constructing a tangent conic from points and lines, each point is allowed to be on at
most one of the tangent lines; if any point is on more than one line, Descarta2D will return
an empty list.
—–
TangentConics2D::parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
Three or more of the defining lines are parallel; no proper conic can be
constructed.
When constructing a tangent conic from defining lines, no triple of lines can be parallel; if any
triple is parallel Descarta2D will return an empty list.
—–
TangentConics2D::pointsOn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [523]
Two or more of the points are on a tangent line; no proper conic can be
constructed.
When constructing a tangent conic from points and lines, each line can have at most one point
on it; if any line has more than one point one it, Descarta2D will return an empty list.
—–
Transform2D
Transform2D::invalidScale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [542]
The scale factor s is invalid; the scale factor must be positive.
The scale factor, s, for a scaling transformation must be positive. Descarta2D will return the
$Failed symbol if a non-positive scale factor is specified.
—–
Error Messages 383
Triangle2D
Triangle2D::imaginary .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [546]
An invalid triangle of the form triangle1 has been detected; the arguments
cannot be imaginary.
The arguments of a triangle cannot be imaginary. Descarta2D will return the $Failed symbol
whenever the arguments to an object are determined to be invalid.
—–
Triangle2D::invalid.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .[546]
An invalid triangle of the form triangle1 has been detected; the vertex
points cannot be collinear.
The vertex points of a triangle cannot be collinear. Descarta2D will return the $Failed symbol
whenever the arguments to an object are determined to be invalid.
—–
Triangle2D::noTriangle .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [553]
Two of the lines {ln1 , ln2 , ln3 } are parallel, or the three are concurrent;
no triangle exists.
When defining a triangle by three lines, the lines must intersect in three distinct points. If any
pair of lines are parallel, or the three lines are concurrent, Descarta2D will return the $Failed
symbol.
—–
Part VII
Packages
D2DArc2D
Initialization
BeginPackage["D2DArc2D‘", {"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘",
"D2DPoint2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DArc2D::usage=
"D2DArc2D is a package that implements the Arc2D object.";
Arc2D::usage=
"Arc2D[{x0,y0},{x1,y1},B] is the standard form of an arc with start
point (x0,y0), end point (x1,y1) and positive bulge factor ’B’.";
Bulge2D::usage=
"Bulge2D[arc] returns the bulge factor of an arc.";
Complement2D::usage=
"Complement2D is a keyword required in Arc2D[arc, Complement2D].";
Begin["‘Private‘"];
Description
Representation
Arc2D[{x0, y0 }, {x1 , y1 }, B] Standard representation of an arc in Descarta2D. The first
argument is a list of coordinates representing the start point of the arc. The second argument
is a list of coordinates representing the end point of the arc. The third argument is a scalar
representing the bulge factor of the arc, B > 0. The arc is traversed counter-clockwise from
P1 to P2 . The bulge factor is the ratio of the arc’s height, h, to half the chord length, d/2; so
B = 2h/d.
387
388 D2DArc2D - Description
Evaluation
Arc2D[{x0, y0 }, {x1 , y1 }, B][t] Evaluates an arc at a parameter value, t, and returns a
list of coordinates {x, y}. Parameters in the range 0 ≤ t ≤ 1 cover the complete span of the
arc.
Arc2D[{x0_,y0_},{x1_,y1_},B_][t_?IsScalar2D] :=
Module[{arc,h,k,beta},
arc=Arc2D[{x0,y0},{x1,y1},B];
{h,k}=Coordinates2D[arc];
beta=Angle2D[arc];
{h+(x0-h)*Cos[beta*t]-(y0-k)*Sin[beta*t],
k+(x0-h)*Sin[beta*t]+(y0-k)*Cos[beta*t]}];
Graphics
Provides graphics primitives for an arc by extending the Mathematica Display command.
Executed when the package is loaded.
SetDisplay2D[
Arc2D[{x0_,y0_},{x1_,y1_},B_][{t1_?IsScalar2D,t2_?IsScalar2D}],
Circle[Coordinates2D[Arc2D[{x0,y0},{x1,y1},B]],
Radius2D[Arc2D[{x0,y0},{x1,y1},B]],
PrimaryAngleRange2D[{
Angle2D[Arc2D[{x0,y0},{x1,y1},B],t1],
Angle2D[Arc2D[{x0,y0},{x1,y1},B],t2]}]] ];
SetDisplay2D[
Arc2D[{x0_,y0_},{x1_,y1_},B_],
Circle[Coordinates2D[Arc2D[{x0,y0},{x1,y1},B]],
Radius2D[Arc2D[{x0,y0},{x1,y1},B]],
PrimaryAngleRange2D[Arc2D[{x0,y0},{x1,y1},B]]] ]
Validation
Arc2D[{x0, y0 }, {x1 , y1 }, B] Detects an arc with imaginary arguments and returns the
$Failed symbol. If the imaginary parts are insignificant, they are removed.
Arc2D::imaginary=
"An invalid arc of the form ’Arc2D[‘1‘, ‘2‘, ‘3‘]’ has been detected;
the arguments cannot be imaginary.";
Arc2D[{x0_,y0_},{x1_,y1_},B_] :=
(Arc2D @@ ChopImaginary2D[Arc$2D[{x0,y0},{x1,y1},B]]) /;
(FreeQ[{x0,y0,x1,y1,B},_Pattern] &&
IsTinyImaginary2D[{x0,y0,x1,y1,B}]);
Arc2D[{x0_,y0_},{x1_,y1_},B_] :=
(Message[Arc2D::imaginary,{x0,y0},{x1,y1},B];$Failed) /;
(FreeQ[{x0,y0,x1,y1,B},_Pattern] &&
IsComplex2D[{x0,y0,x1,y1,B},0]);
D2DArc2D - Scalars 389
Arc2D[{x0, y0 }, {x1 , y1 }, B] Detects an arc with a negative bulge factor and returns an
arc with the defining points interchanged and the positive bulge factor.
Arc2D[{x0_,y0_},{x1_,y1_},B_?IsNegative2D] :=
Arc2D[{x1,y1},{x0,y0},-B];
Arc2D[{x0, y0 }, {x1 , y1 }, B] Detects an arc with a zero bulge factor and returns the
$Failed symbol.
Arc2D::invalid=
"An invalid arc of the form ’Arc2D[‘1‘, ‘2‘, ‘3‘]’ has been detected;
the bulge factor must be positive and the defining points must be
distinct.";
Arc2D[{x0_,y0_},{x1_,y1_},B_] :=
(Message[Arc2D::invalid,{x0,y0},{x1,y1},B];$Failed) /;
(FreeQ[{x0,y0,x1,y1,B},_Pattern] &&
IsZero2D[B,0]);
Arc2D[{x0, y0 }, {x1 , y1 }, B] Detects an arc whose defining points are coincident and
returns the $Failed symbol.
Arc2D[{x0_,y0_},{x1_,y1_},B_] :=
(Message[Arc2D::invalid,{x0,y0},{x1,y1},B];$Failed) /;
(FreeQ[{x0,y0,x1,y1,B},_Pattern] &&
IsZero2D[Distance2D[{x0,y0},{x1,y1}]]);
Scalars
Angular Span of an Arc
Angle2D[arc] Computes the angular span of an arc. The result is returned in radians.
Angle2D[Arc2D[{x0_,y0_},{x1_,y1_},B_]] := 4*ArcTan[B];
Bulge2D[Arc2D[{x0_,y0_},{x1_,y1_},B_]] := B;
PrimaryAngleRange2D[A:Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
Module[{h,k},
{h,k}=Coordinates2D[A];
PrimaryAngleRange2D[{ArcTan[x0-h,y0-k],
ArcTan[x1-h,y1-k]}] ];
Radius of an Arc
Radius2D[arc] Computes the radius of an arc.
Radius2D[Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
Sqrt[(x0-x1)^2+(y0-y1)^2]*(B+1/B)/4;
Transformations
Reflect
Reflect2D[arc, line] Reflects an arc in a line.
Reflect2D[Arc2D[{x0_,y0_},{x1_,y1_},B_],L:Line2D[a_,b_,c_]] :=
Arc2D[Reflect2D[{x1,y1},L],Reflect2D[{x0,y0},L],B];
Rotate
Rotate2D[arc, θ, coords] Rotates an arc by an angle θ about a position given by a coordi-
nate list. If the third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Rotate2D[Arc2D[{x0_,y0_},{x1_,y1_},B_],theta_?IsScalar2D,
{xc_?IsScalar2D,yc_?IsScalar2D}] :=
Arc2D[Rotate2D[{x0,y0},theta,{xc,yc}],
Rotate2D[{x1,y1},theta,{xc,yc}],B];
D2DArc2D - Construction 391
Scale
Scale2D[arc, s, coords] Scales an arc from a position given by coordinates. If the position
is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Arc2D[{x0_,y0_},{x1_,y1_},B_],s_?IsScalar2D,
{xc_?IsScalar2D,yc_?IsScalar2D}] :=
Arc2D[Scale2D[{x0,y0},s,{xc,yc}],
Scale2D[{x1,y1},s,{xc,yc}],B] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[arc, {u, v}] Translates an arc delta distance.
Translate2D[Arc2D[{x0_,y0_},{x1_,y1_},B_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Arc2D[{x0+u,y0+v},{x1+u,y1+v},B];
Construction
Center Point of an Arc
Point2D[arc] Constructs the center point of the arc.
Point2D[Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
Module[{K},
K=(1/B-B)/4;
Point2D[{(x0+x1)/2+K*(y0-y1),(y0+y1)/2-K*(x0-x1)}] ];
Circle2D[A:Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
Circle2D[Coordinates2D[A],Radius2D[A]];
Complement Arc
Arc2D[arc, Complement2D] Constructs an arc that is the complement of a given arc.
Arc2D[Arc2D[{x0_,y0_},{x1_,y1_},B_],Complement2D] :=
Arc2D[{x1,y1},{x0,y0},1/B];
392 D2DArc2D - Construction
Arc2D::invalidSpan=
"The angular span of the arc is invalid; the span cannot be an integer
multiple of 2Pi radians.";
Arc2D::invalidRadius=
"The radius, ‘1‘, of the arc is invalid; the radius must be positive.";
Arc2D[Point2D[c:{h_,k_}], r_?IsZeroOrNegative2D,
{t0_?IsScalar2D,t1_?IsScalar2D}] :=
(Message[Arc2D::invalidRadius,r];$Failed);
Arc2D[Point2D[c:{h_,k_}], r_?IsScalar2D,
{t0_?IsScalar2D,t1_?IsScalar2D}] :=
(Message[Arc2D::invalidSpan];$Failed) /;
IsZero2D[Distance2D[Circle2D[c,r][t0],Circle2D[c,r][t1]]];
Arc2D[Point2D[c:{h_,k_}], r_?IsScalar2D,
{t0_?IsScalar2D,t1_?IsScalar2D}] :=
Module[{T0,T1,p0,p1,d,pm,H,B},
{T0,T1}=PrimaryAngleRange2D[{t0,t1}];
p0=Circle2D[c,r][T0];
p1=Circle2D[c,r][T1];
d=Distance2D[p0,p1];
pm=Circle2D[c,r][(T0+T1)/2];
H=Distance2D[(p0+p1)/2,pm];
B=2*H/d;
Arc2D[p0,p1,B] ];
Arc2D::invalidEntryAngle=
"The entry angle of the arc is invalid; the entry angle cannot be an
integer multiple of Pi radians.";
Arc2D::invalidCoincident=
"The defining points are coincident; an arc cannot be constructed.";
D2DArc2D - Construction 393
Arc2D[{P0:Point2D[p0:{x0_,y0_}],A_?IsScalar2D},
P1:Point2D[p1:{x1_,y1_}]] :=
Which[
IsZero2D[PrimaryAngle2D[A,Pi]],
Message[Arc2D::invalidEntryAngle];$Failed,
IsCoincident2D[P0,P1],
Message[Arc2D::invalidCoincident];$Failed,
True,
Arc2D[p0,p1,Tan[A/2]] ];
Arc2D::invalidCollinear=
"The three defining points are collinear; an arc cannot be constructed.";
Minor$2D[{u1_,v1_},{u2_,v2_}] := u1*v2-u2*v1;
Arc2D[P0:Point2D[p0:{x0_,y0_}],
Pon:Point2D[pon:{xon_,yon_}],
P1:Point2D[p1:{x1_,y1_}]] :=
Module[{s,c,B},
Which[
IsCollinear2D[P0,Pon,P1],
Message[Arc2D::invalidCollinear];$Failed,
True,
s=Minor$2D[pon-p0,p1-pon];
c=Dot[pon-p0,p1-pon];
B=s/(c+Sqrt[c^2+s^2]);
Arc2D[p0,p1,B]] ];
Arc2D[P:Point2D[{h_,k_}],r_?IsScalar2D,
{P0:Point2D[{x0_,y0_}],P1:Point2D[{x1_,y1_}]}] :=
Which[
IsZeroOrNegative2D[r],
Message[Arc2D::invalidRadius,r];$Failed,
IsCoincident2D[P,P0] || IsCoincident2D[P,P1],
Message[Arc2D::invalidCoincident];$Failed,
True,
Arc2D[Point2D[{h,k}],r,
{ArcTan[x0-h,y0-k],ArcTan[x1-h,y1-k]}] ]
394 D2DArc2D - Epilogue
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DArc2D‘" *)
D2DArcLength2D
The package D2DArcLength2D provides functions for computing the arc length of Descarta2D
objects.
Initialization
BeginPackage["D2DArcLength2D‘", {"D2DArc2D‘", "D2DCircle2D‘",
"D2DConicArc2D‘", "D2DEllipse2D‘", "D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DHyperbola2D‘", "D2DLine2D‘", "D2DNumbers2D‘", "D2DParabola2D‘",
"D2DSegment2D‘", "D2DTriangle2D‘"}];
D2DArcLength2D::usage=
"D2DArcLength2D is a package for computing the arc length of curves.";
ArcLength2D::usage=
"ArcLength2D[curve,{t0,t1}] computes the arc length of a curve between
two parameters.";
Circumference2D::usage=
"Circumference2D[circle] computes the circumference of a circle.
Circumference2D[ellipse] computes the circumference of an ellipse.";
Perimeter2D::usage=
"Perimeter2D[triangle] computes the perimeter of a triangle.";
Span2D::usage=
"Span2D[arc] computes the span (arc length) of an arc; N[Span2D[cnarc]]
numerically computes the span (arc length) of a conic arc.";
Begin["‘Private‘"];
Arc Length
Arc
Span2D[arc] Computes the arc length of a complete span of an arc.
395
396 D2DArcLength2D - Arc Length
Span2D[A:Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
Module[{theta1,theta2},
{theta1,theta2}=PrimaryAngleRange2D[A];
Radius2D[A]*(theta2-theta1) ];
ArcLength2D[arc, {θ1 , θ2 }] Computes the arc length of an arc between two parameters.
ArcLength2D[A:Arc2D[{x0_,y0_},{x1_,y1_},B_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2},
{T1,T2}=PrimaryAngleRange2D[{Angle2D[A,t1],Angle2D[A,t2]}];
Radius2D[A]*(T2-T1) ];
Circle
Circumference2D[circle] Computes the circumference of a circle.
Circumference2D[Circle2D[{h_,k_},r_]] := 2*Pi*r;
ArcLength2D[circle, {θ1 , θ2 }] Computes the arc length of a circle between two parameters.
ArcLength2D[Circle2D[{h_,k_},r_],{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
r*(T2-T1) ];
Conic Segment
Span2D[cnarc] //N Computes the arc length of a complete span of a conic arc numerically.
N[Span2D[C1:ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_]]] :=
NArcLength$2D[C1,{0,1},$MachinePrecision] /;
IsNumeric2D[C1,Span2D];
N[Span2D[C1:ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_]],n_] :=
NArcLength$2D[C1,{0,1},n] /;
IsNumeric2D[C1,Span2D];
ArcLength2D[cnarc, {θ1 , θ2 }] //N Computes the arc length of a conic arc between two
parameters numerically.
N[ArcLength2D[C1:ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
{t1_?IsScalar2D,t2_?IsScalar2D}]] :=
NArcLength$2D[C1,{t1,t2},$MachinePrecision] /;
IsNumeric2D[{C1,t1,t2},ArcLength2D];
N[ArcLength2D[C1:ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
{t1_?IsScalar2D,t2_?IsScalar2D}],
n_] :=
NArcLength$2D[C1,{t1,t2},n] /;
IsNumeric2D[{C1,t1,t2},ArcLength2D];
D2DArcLength2D - Arc Length 397
Ellipse
Circumference2D[ellipse] Computes the circumference of an ellipse.
Circumference2D[E1:Ellipse2D[{h_,k_},a_,b_,theta_]] :=
ArcLength2D[E1,{0,2Pi}];
ArcLength2D[ellipse, {θ1 , θ2 }] Computes the arc length of an ellipse between two para-
meters.
ArcLength2D[Ellipse2D[{h_,k_},a_,b_,theta_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2,L},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
L=b*(EllipticE[T2,1-a^2/b^2]-EllipticE[T1,1-a^2/b^2]);
If[IsNegative2D[L],-L,L] ];
Hyperbola
The private function ArcLengthHyperbola$2D[hyperbola, {0, t}] computes the arc length
of a hyperbola between parameter values 0 and t. The result may be positive or negative,
depending on the value given for t.
ArcLengthHyperbola$2D[Hyperbola2D[{h_,k_},a_,b_,theta_],{0,t_}] :=
Re[-I*b*EllipticE[I*ArcCosh[Sqrt[a^2+b^2]/a]*t,1+a^2/b^2]];
Line
ArcLength2D[line, {t1 , t2 }] Computes the arc length of a line between two parameters.
ArcLength2D[Line2D[a_,b_,c_],{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{L},
L=t2-t1;
If[IsNegative2D[L],-L,L] ];
Line Segment
ArcLength2D[lnseg, {t1 , t2 }] Computes the arc length of a line segment between two
parameters. The function Length2D[lnseg] computes the length of a complete line segment
(defined in package D2DSegment2D).
398 D2DArcLength2D - Epilogue
ArcLength2D[Segment2D[{x0_,y0_},{x1_,y1_}],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{L},
L=(t2-t1)*Sqrt[(x0-x1)^2+(y0-y1)^2];
If[IsNegative2D[L],-L,L] ];
Parabola
ArcLength2D[parabola, {t1 , t2 }] Computes the arc length of a parabola between two
parameter values.
ArcLength2D[Parabola2D[{h_,k_},f_,t_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{S1=Sqrt[1+t1^2],S2=Sqrt[1+t2^2]},
L=f*( (S2*t2+Log[2*f^2(S2+t2)]) -
(S1*t1+Log[2*f^2(S1+t1)]) );
If[IsNegative2D[L],-L,L] ];
Triangle
Perimeter2D[triangle] Computes the perimeter of a triangle.
Perimeter2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}]] :=
Sqrt[(x1-x2)^2+(y1-y2)^2]+
Sqrt[(x1-x3)^2+(y1-y3)^2]+
Sqrt[(x2-x3)^2+(y2-y3)^2];
NArcLength$2D[obj_,{t1_,t2_},n_] :=
Module[{t,Dx,Dy,L},
{Dx,Dy}=Map[D[#,t]&,obj[t]];
L=NIntegrate[Sqrt[Dx^2+Dy^2],{t,t1,t2},WorkingPrecision->n];
If[IsNegative2D[L],-L,L] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DArcLength2D‘" *)
D2DArea2D
Initialization
BeginPackage["D2DArea2D‘", {"D2DArc2D‘", "D2DCircle2D‘", "D2DConicArc2D‘",
"D2DEllipse2D‘", "D2DExpressions2D‘", "D2DGeometry2D‘", "D2DHyperbola2D‘",
"D2DLine2D‘", "D2DNumbers2D‘", "D2DParabola2D‘", "D2DPoint2D‘",
"D2DTriangle2D‘"}];
D2DArea2D::usage=
"D2DArea2D is a package for computing areas.";
Area2D::usage=
"Area2D[object] computes the area of a closed object";
SectorArea2D::usage=
"SectorArea2D[object,{t1,t2}] computes the area of a sector of an
object.";
SegmentArea2D::usage=
"SegmentArea2D[object,{t1,t2}] computes the area of a segment of an
object.";
Begin["‘Private‘"];
Area2D[A:Arc2D[{x0_,y0_},{x1_,y1_},B_]] :=
SegmentArea2D[Circle2D[A],PrimaryAngleRange2D[A]];
399
400 D2DArea2D - Areas Associated with a Conic Arc
Area2D[Circle2D[{h_,k_},r_]] := Pi*r^2;
Sector Area
SectorArea2D[circle, {θ1 , θ2 }] Computes the area of a circle sector defined by two
parameters.
SectorArea2D[Circle2D[{h_,k_},r_],{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
(T2-T1)*r^2/2 ];
Segment Area
SegmentArea2D[circle, {θ1 , θ2 }] Computes the area of a circle segment defined by two
parameters.
SegmentArea2D[Circle2D[{h_,k_},r_],{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2,theta},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
theta=T2-T1;
r^2*(theta-Sin[theta])/2 ];
Area2D[ConicArc2D[{0,0},{a_,b_},{d_,0},p_]] :=
Module[{A},
A=d*b/3;
If[IsNegative2D[A],-A,A] ] /;
IsZero2D[p-1/2];
Area2D[ConicArc2D[{0,0},{a1_,b1_},{d1_,0},p_]] :=
Module[{b,d,r},
b*d*p*(p*r+(-1+p)^2*Log[(1-p)/(p+r)])/(2*r^3) //.
{r->Sqrt[-1+2p],b->Sqrt[b1^2],d->Sqrt[d1^2]}] /;
Not[IsZero2D[p-1/2]];
D2DArea2D - Areas Associated with an Ellipse 401
Area2D[cnarc] Computes the area between a conic arc and its chord. Notice that the
x-coordinate of the apex point in standard position has no bearing on the area, and, therefore,
is not computed.
Area2D[ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_]] :=
Module[{a,b,d},
b=Distance2D[Point2D[pA],Line2D[p0,p1]];
d=Distance2D[p0,p1];
Area2D[ConicArc2D[{0,0},{a,b},{d,0},p]] ];
Sector Area
SectorArea2D[ellipse, {0, θ}] Computes the area of an ellipse sector between parameter
values 0 and θ.
SectorArea2D[E1:Ellipse2D[{h_,k_},a_,b_,alpha_],{0,t_?IsScalar2D}] :=
Module[{T=PrimaryAngle2D[t]},
Which[
IsZero2D[T], Pi*a*b,
IsNegative2D[Pi-T], Pi*a*b/2+SectorArea2D[E1,{0,T-Pi}],
True, a*b*(Pi-2*ArcSin[Cos[t]])/4] ];
SectorArea2D[E1:Ellipse2D[{h_,k_},a_,b_,alpha_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
Which[
IsZero2D[2Pi-(T2-T1)],
Area2D[E1],
IsNegative2D[2Pi-T2],
Pi*a*b-SectorArea2D[E1,{T2-2Pi,T1}],
True,
SectorArea2D[E1,{0,T2}]-SectorArea2D[E1,{0,T1}]] ];
Segment Area
SegmentArea2D[ellipse, {θ1 , θ2 }] Computes the area of an ellipse segment between two
parameter values.
402 D2DArea2D - Areas Associated with a Parabola
SegmentArea2D[E1:Ellipse2D[{h_,k_},a_,b_,alpha_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2},
{T1,T2}=PrimaryAngleRange2D[{t1,t2}];
SectorArea2D[E1,{T1,T2}]-a*b*Sin[T2-T1]/2 ];
SectorArea2D[Hyperbola2D[{h_,k_},a_,b_,t_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{e,s,A},
e=Sqrt[a^2+b^2]/a;
s=ArcCosh[e];
A=a*b*s*(t2-t1)/2;
If[IsNegative2D[A],-A,A] ];
Segment Area
SegmentArea2D[hyperbola, {t1 , t2 }] Computes the area of a hyperbola segment between
two parameters.
SegmentArea2D[Hyperbola2D[{h_,k_},a_,b_,t_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{e,s,T,A},
e=Sqrt[a^2+b^2]/a;
s=ArcCosh[e];
T=s*(t2-t1);
A=a*b*(Sinh[T]-T)/2;
If[IsNegative2D[A],-A,A] ];
SegmentArea2D[Parabola2D[{h_,k_},f_,theta_],
{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{A},
A=f^2*(t2-t1)^3/3;
If[IsNegative2D[A],-A,A] ];
D2DArea2D - Areas Associated with a Triangle 403
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DArea2D‘" *)
D2DCircle2D
Initialization
BeginPackage["D2DCircle2D‘", {"D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DCircle2D::usage=
"D2DCircle2D is a package that implements the Circle2D object.";
Circle2D::usage=
"Circle2D[{h,k},r] is the standard form of a circle with radius ’r’
centered at {h,k}.";
Radius2D::usage=
"Radius2D[circle] gives the radius of a circle.";
Begin["‘Private‘"];
Description
Representation
Circle2D[{h, k}, r] Standard representation of a circle in Descarta2D. The center of the
circle is (h, k) and the radius is r.
Equation
Quadratic2D[circle] Constructs the quadratic representing the equation of a circle.
Quadratic2D[Circle2D[{h_,k_},r_]] :=
Quadratic2D[1,0,1,-2*h,-2*k,h^2+k^2-r^2];
405
406 D2DCircle2D - Description
Evaluation
Circle2D[{h, k}, r][θ] Evaluates a parameter, θ, on a circle and returns a coordinate
list {x, y}. Parameters in the range 0 ≤ θ < 2π cover a complete circle.
Circle2D[{h_,k_},r_][t_?IsScalar2D] := {h+r*Cos[t],k+r*Sin[t]};
Graphics
Provides graphics primitives for a circle by extending the Mathematica Display command.
Executed when the package is loaded.
SetDisplay2D[
Circle2D[{h_,k_},r_][{t1_?IsScalar2D,t2_?IsScalar2D}],
Circle[{h,k},r,PrimaryAngleRange2D[{t1,t2}]] ];
SetDisplay2D[
Circle2D[{h_,k_},r_],
Circle[{h,k},r] ];
Validation
Circle2D[{h, k}, r] Detects a circle with imaginary arguments and returns the $Failed
symbol. If the imaginary parts are insignificant, they are removed.
Circle2D::imaginary=
"An invalid circle of the form ’Circle2D[‘1‘,‘2‘]’ has been detected;
the arguments cannot be imaginary.";
Circle2D[{h_,k_},r_] :=
(Circle2D @@ ChopImaginary2D[Circle$2D[{h,k},r]]) /;
(FreeQ[{h,k,r},_Pattern] && IsTinyImaginary2D[{h,k,r}]);
Circle2D[{h_,k_},r_] :=
(Message[Circle2D::imaginary,{h,k},r];$Failed) /;
(FreeQ[{h,k,r},_Pattern] && IsComplex2D[{h,k,r},0]);
Circle2D[{h, k}, r] Detects a circle whose radius is non-positive and returns the $Failed
symbol.
Circle2D::invalid=
"An invalid circle of the form ’Circle2D[‘1‘, ‘2‘]’ has been detected;
the radius must be positive.";
Circle2D[{h_,k_},r_] :=
(Message[Circle2D::invalid,{h,k},r];$Failed) /;
(FreeQ[{h,k,r},_Pattern] && IsZeroOrNegative2D[r,0]);
Scalars
Distance Point/Circle
Distance2D[point, circle] Computes the distance between a point and a circle.
Distance2D[Point2D[{x_,y_}],Circle2D[{h_,k_},r_]] :=
Sqrt[(Distance2D[{x,y},{h,k}]-r)^2];
Radius
Radius2D[circle] Returns the radius of a circle.
Radius2D[Circle2D[{h_,k_},r_]] := r;
Transformations
Reflect
Reflect2D[circle, line] Reflects a circle in a line.
Reflect2D[Circle2D[{h_,k_},r_],L:Line2D[a_,b_,c_]] :=
Circle2D[Reflect2D[{h,k},L],r];
Rotate
Rotate2D[circle, θ, coords] Rotates a circle by an angle θ about a position speci-
fied by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Circle2D[{h_,k_},r_],theta_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Circle2D[Rotate2D[{h,k},theta,{x0,y0}],r];
Scale
Scale2D[circle, s, coords] Scales a circle from a coordinate position. If the position is
omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Circle2D[{h_,k_},r_],s_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Circle2D[Scale2D[{h,k},s,{x0,y0}],s*r] /;
Not[IsZeroOrNegative2D[s]];
408 D2DCircle2D - Line Construction
Translate
Translate2D[circle, {u, v}] Translates a circle delta distance.
Translate2D[Circle2D[{h_,k_},r_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Circle2D[{h+u,k+v},r];
Point Construction
Center Point
Point2D[circle] Constructs the center point of the circle.
Point2D[Circle2D[{h_,k_},r_]] := Point2D[{h,k}];
Pole Point
Point2D[line, circle] Constructs a point that is the pole point of a line with respect to a
circle. If the line is tangent to the circle then the point is the tangency point.
Point2D[L1:Line2D[a1_,b1_,c1_],C2:Circle2D[{h2_,k2_},r2_]] :=
Point2D[L1,Quadratic2D[C2]];
Line Construction
Polar Line
Line2D[point, circle] Constructs a line that is the polar line of a point with respect to a
circle. If the point is on the circle then the line is tangent to the circle.
Line2D[P1:Point2D[{x1_,y1_}],C2:Circle2D[{h2_,k2_},r2_]] :=
Line2D[P1,Quadratic2D[C2]];
Radical Axis
Line2D[circle, circle] Constructs a line that is the radical axis of two circles.
Line2D::concentric=
"The circles {‘1‘, ‘2‘} are concentric; no radical axis exists.";
Line2D[C1:Circle2D[{h1_,k1_},r1_],C2:Circle2D[{h2_,k2_},r2_]] :=
If[IsConcentric2D[C1,C2],
Message[Line2D::concentric,C1,C2];$Failed,
Line2D[2*(h2-h1),2*(k2-k1),(h1^2-h2^2)+(k1^2-k2^2)+(r2^2-r1^2)]];
D2DCircle2D - Circle Construction 409
Circle Construction
Circle from Quadratic Equation
Circle2D[quad] Constructs a circle from a quadratic. The quadratic must be recognizable
as a circle.
Circle2D::noCircle=
"The curve represented by ‘1‘ is not a circle.";
Circle2D[Q:Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Module[{s},
If[IsZero2D[{a-c,b},And] && Not[IsZero2D[{a,c},Or]],
s=(d^2+e^2-4*a*f)/a^2;
If[IsZeroOrNegative2D[s],
Message[Circle2D::noCircle,Q];$Failed,
Circle2D[{-d/(2a),-e/(2a)},Sqrt[s]/2]],
Message[Circle2D::noCircle,Q];$Failed] ];
Circle2D[P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}],
P3:Point2D[{x3_,y3_}]] :=
If[IsCollinear2D[P1,P2,P3],
Message[Circle2D::collinear,P1,P2,P3];$Failed,
Circle2D[Quadratic2D[P1,P2,P3]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DCircle2D‘" *)
D2DConic2D
The package D2DConic2D provides functions for constructing various points, lines and line
segments associated with conic curves.
Initialization
BeginPackage["D2DConic2D‘", {"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DExpressions2D‘", "D2DHyperbola2D‘", "D2DLine2D‘", "D2DParabola2D‘",
"D2DPoint2D‘", "D2DSegment2D‘", "D2DTransform2D‘"}];
D2DConic2D::usage=
"D2DConic2D is a package for constructing geometry associated with conic
curves.";
Asymptotes2D::usage=
"Asymptotes2D[hyperbola] constructs a list containing the two asymptote
lines of a hyperbola.";
Directrices2D::usage=
"Directrices2D[conic] constructs a list containing the directrix line(s)
of a conic curve (one for a parabola, two for ellipses and hyperbolas).";
Eccentricity2D::usage=
"Eccentricity2D[conic] computes the eccentricity of a conic curve
(parabola, ellipse or hyperbola).";
FocalChords2D::usage=
"FocalChords2D[conic] constructs a list containing the focal chords
(line segments) of a conic curve (one for a parabola, two for ellipses and
hyperbolas).";
Foci2D::usage=
"Foci2D[conic] constructs a list containing the focus point(s) of a
conic curve (one for a parabola, two for ellipses and hyperbolas).";
Vertices2D::usage=
"Vertices2D[conic] contructs a list containing the vertex point(s) of a
conic curve (one for a parabola, two for ellipses and hyperbolas).";
Begin["‘Private‘"];
411
412 D2DConic2D - Point Construction
Scalars
Eccentricity
Eccentricity2D[ellipse] Computes the eccentricity of an ellipse.
Eccentricity2D[Ellipse2D[{h_,k_},a_,b_,theta_]] := Sqrt[a^2-b^2]/a;
Eccentricity2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] := Sqrt[a^2+b^2]/a;
Eccentricity2D[Parabola2D[{h_,k_},f_,theta_]] := 1;
Point Construction
Focus Points
Foci2D[ellipse] Constructs a list containing the two focus points of an ellipse.
Foci2D[E1:Ellipse2D[{h_,k_},a_,b_,theta_]] :=
Module[{e=Eccentricity2D[E1]},
{Point2D[Rotate2D[{h+a*e,k},theta,{h,k}]],
Point2D[Rotate2D[{h-a*e,k},theta,{h,k}]]}];
Foci2D[H1:Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Module[{e=Eccentricity2D[H1]},
{Point2D[Rotate2D[{h+a*e,k},theta,{h,k}]],
Point2D[Rotate2D[{h-a*e,k},theta,{h,k}]]}];
Foci2D[Parabola2D[{h_,k_},f_,theta_]] :=
{Point2D[Rotate2D[{h+f,k},theta,{h,k}]]};
Vertex Points
Vertices2D[ellipse] Constructs a list containing the two vertex points of an ellipse.
Vertices2D[Ellipse2D[{h_,k_},a_,b_,theta_]] :=
{Point2D[Rotate2D[{h+a,k},theta,{h,k}]],
Point2D[Rotate2D[{h-a,k},theta,{h,k}]]};
D2DConic2D - Line Construction 413
Vertices2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
{Point2D[Rotate2D[{h+a,k},theta,{h,k}]],
Point2D[Rotate2D[{h-a,k},theta,{h,k}]]};
Line Construction
Asymptote Lines
Asymptotes2D[hyperbola] Constructs a list containing the two asymptote lines of a hyper-
bola.
Asymptotes2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
{Rotate2D[Line2D[b, a,-a*k-b*h],theta,{h,k}],
Rotate2D[Line2D[b,-a, a*k-b*h],theta,{h,k}]};
Directrix Lines
Directrices2D[ellipse] Constructs a list containing the two directrix lines of an ellipse.
Directrices2D::circular=
"The ellipse ‘1‘ is circular; it has no (finite) directrix lines.";
Directrices2D[E1:Ellipse2D[{h_,k_},a_,b_,theta_]] :=
Module[{e=Eccentricity2D[E1]},
If[IsZero2D[e],
Message[Directrices2D::circular,E1];{},
{Rotate2D[Line2D[1,0,-(h+a/e)],theta,{h,k}],
Rotate2D[Line2D[1,0,-(h-a/e)],theta,{h,k}]}] ];
Directrices2D[Parabola2D[{h_,k_},f_,theta_]] :=
{Rotate2D[Line2D[1,0,-h+f],theta,{h,k}]};
414 D2DConic2D - Epilogue
FocalChords2D[hyperbola] Constructs a list containing two line segments that are the
focal chords of a hyperbola.
FocalChords2D[H1:Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Module[{e,l1,l2},
e=Eccentricity2D[H1];
l1=Segment2D[{h+a*e,k+b^2/a},{h+a*e,k-b^2/a}];
l2=Segment2D[{h-a*e,k+b^2/a},{h-a*e,k-b^2/a}];
Map[Rotate2D[#,theta,{h,k}]&,{l1,l2}] ];
FocalChords2D[parabola] Constructs a list containing one line segment that is the single
focal chord of the parabola.
FocalChords2D[Parabola2D[{h_,k_},f_,theta_]] :=
{Rotate2D[Segment2D[{h+f,k+2*f},{h+f,k-2*f}],theta,{h,k}]};
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DConic2D‘" *)
D2DConicArc2D
Initialization
BeginPackage["D2DConicArc2D‘",{"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DEquations2D‘", "D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DHyperbola2D‘", "D2DIntersect2D‘", "D2DLine2D‘", "D2DLoci2D‘",
"D2DMaster2D‘", "D2DNumbers2D‘", "D2DParabola2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DConicArc2D::usage=
"D2DConicArc2D is a package providing the conic arc object.";
Apex2D::usage=
"Apex2D is a keyword used in Point2D[cnarc,Apex2D] to construct the apex
control point of a conic arc.";
ConicArc2D::usage=
"ConicArc2D[{x0,y0},{xA,yA},{x1,y1},p] is the standard form of conic arc
with start point (x0,y0), end point (x1,y1), apex point (xA,yA) and
projective discriminant ’p’.";
Rho2D::usage=
"Rho2D[cnarc] returns the rho value of a conic arc; 0<rho<1/2 is an
ellipse; rho=1/2 is a parabola; 1/2<rho<1 is a hyperbola.";
Begin["‘Private‘"];
Description
Representation
ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ] Standard representation of a conic arc in
Descarta2D. The first and third arguments are the coordinates of the start and end points
of the conic arc, respectively. The second argument is the coordinates of the apex point of
the conic arc (the apex point is the intersection of the start/end point tangents). The fourth
argument is a scalar representing the ρ value of the conic arc (0 < ρ < 1/2, ellipse; ρ = 1/2,
parabola; 1/2 < ρ < 1, hyperbola).
415
416 D2DConicArc2D - Description
Equation
Quadratic2D[cnarc] Constructs a quadratic representing the equation of the curve asso-
ciated with a conic arc.
Quadratic2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_]] :=
Module[{eqn,a,b,k,x,y},
eqn=a*b==k*(1-a-b)^2 /.
{k->(1-p)^2/(4*p^2),
a->(( y-yA)*(x1-xA)-( x-xA)*(y1-yA))/
((y0-yA)*(x1-xA)-(x0-xA)*(y1-yA)),
b->(( y-yA)*(x0-xA)-( x-xA)*(y0-yA))/
((y1-yA)*(x0-xA)-(x1-xA)*(y0-yA))};
Quadratic2D[eqn,{x,y}] ];
Evaluation
ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ][t] Evaluates a conic arc at a parameter,
t, and returns a list of coordinates {x, y}. Parameter values in the range 0 ≤ t ≤ 1 cover the
complete span of the conic arc.
ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_][t_?IsScalar2D] :=
Module[{b0,b1,b2},
b0=(1-t)^2; b1=2*t*(1-t); b2=t^2;
(b0*(1-p)*p0+b1*p*pA+b2*(1-p)*p1)/(b0*(1-p)+b1*p+b2*(1-p))];
Graphics
Provides graphics primitives for a conic arc by extending the Mathematica Display command.
Executed when the package is loaded.
SetDisplay2D[
ConicArc2D[{x0_,y0_},{xA_,yA_},
{x1_,y1_},p_][{t1_?IsScalar2D,t2_?IsScalar2D}],
MakePrimitives2D[
ConicArc2D[{x0,y0},{xA,yA},{x1,y1},p],{t1,t2}] ];
SetDisplay2D[
ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
MakePrimitives2D[
ConicArc2D[{x0,y0},{xA,yA},{x1,y1},p],{0,1}] ];
Validation
ConicArc2D[{x0, y0 }, {xA , yA }, {x1 , y1 }, ρ] Detects a conic arc with imaginary argu-
ments and returns the $Failed symbol. If the imaginary parts are insignificant, they are
removed.
ConicArc2D::imaginary=
"An invalid conic arc of the form ’ConicArc2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has
been detected; the arguments cannot be imaginary.";
D2DConicArc2D - Scalars 417
ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_] :=
(ConicArc2D @@ ChopImaginary2D[ConicArc$2D[p0,pA,p1,p]]) /;
(FreeQ[{p0,pA,p1,p},_Pattern] && IsTinyImaginary2D[{p0,pA,p1,p}]);
ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_] :=
(Message[ConicArc2D::imaginary,p0,pA,p1,p];$Failed) /;
(FreeQ[{p0,pA,p1,p},_Pattern] && IsComplex2D[{p0,pA,p1,p},0]);
ConicArc2D::points=
"An invalid conic arc of the form ’ConicArc2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has
been detected; the control points cannot be collinear.";
ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_] :=
(Message[ConicArc2D::points,p0,pA,p1,p];$Failed) /;
(FreeQ[{p0,pA,p1,p},_Pattern] &&
IsCollinear2D[Point2D[p0],Point2D[pA],Point2D[p1]]);
ConicArc2D::rho=
"An invalid conic arc of the form ’ConicArc2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has
been detected; the value of rho must be in the range 0<rho<1.";
ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_] :=
(Message[ConicArc2D::rho,p0,pA,p1,p];$Failed) /;
(FreeQ[{p0,pA,p1,p},_Pattern] &&
(IsZeroOrNegative2D[p,0] || IsZeroOrNegative2D[1-p,0]));
IsValid2D[
ConicArc2D[{x0_?IsScalar2D,y0_?IsScalar2D},
{xA_?IsScalar2D,yA_?IsScalar2D},
{x1_?IsScalar2D,y1_?IsScalar2D},p_?IsScalar2D]] := True;
Scalars
Rho
Rho2D[cnarc] Returns the ρ value of a conic arc.
Rho2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_]] := p;
418 D2DConicArc2D - Transformations
Transformations
Reflect
Reflect2D[cnarc, line] Reflects a conic arc in a line.
Reflect2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
L:Line2D[A2_,B2_,C2_]] :=
ConicArc2D[Reflect2D[{x0,y0},L],
Reflect2D[{xA,yA},L],
Reflect2D[{x1,y1},L],p];
Rotate
Rotate2D[cnarc, θ, coords] Rotates a conic arc by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
ConicArc2D[Rotate2D[{x0,y0},theta,{h,k}],
Rotate2D[{xA,yA},theta,{h,k}],
Rotate2D[{x1,y1},theta,{h,k}],p];
Scale
Scale2D[cnarc, s, coords] Scales a conic arc by a scale factor, s, from a position given by
coordinates. If the position is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
ConicArc2D[Scale2D[{x0,y0},s,{h,k}],
Scale2D[{xA,yA},s,{h,k}],
Scale2D[{x1,y1},s,{h,k}],p] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[cnarc, {u, v}] Translates a conic arc delta distance.
Translate2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
ConicArc2D[{x0+u,y0+v},{xA+u,yA+v},{x1+u,y1+v},p];
D2DConicArc2D - Construction 419
Construction
Apex Point
Point2D[cnarc, Apex2D] Constructs the apex control point of a conic arc.
Point2D[ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_],
Apex2D] := Point2D[{xA,yA}];
Center Point
Point2D[cnarc] Constructs the center point of the central conic underlying a conic arc.
Point2D::notCentral1=
"The conic underlying ‘1‘ is not a central conic; it has no center
point.";
Point2D[C1:ConicArc2D[p0:{x0_,y0_},pA:{xA_,yA_},p1:{x1_,y1_},p_]] :=
If[IsZero2D[p-1/2],
Message[Point2D::notCentral1,C1];$Failed,
Point2D[(-p^2*pA+(p-1)^2*(p0+p1)/2)/(1-2*p)] ];
Loci2D[C1:ConicArc2D[{x0_,y0_},{xA_,yA_},{x1_,y1_},p_]] :=
Loci2D[Quadratic2D[C1]];
ConicArc2D::noChord=
"No chord exists between ‘1‘ and ‘2‘; a conic arc cannot be
constructed.";
ConicArc2D::center=
"The chord defined by ‘1‘ passes through the center of ‘2‘; a conic arc
cannot be constructed.";
The private function FindRho$2D[curve, point, {point, point}] computes ρ for a conic arc
from the apex point and start/end points.
FindRho$2D[Parabola2D[{h_,k_},f_,theta_],
Point2D[{xA_,yA_}],
{Point2D[{x0_,y0_}],Point2D[{x1_,y1_}]}] := 1/2;
420 D2DConicArc2D - Epilogue
FindRho$2D[Circle2D[{h_,k_},r_] |
Ellipse2D[{h_,k_},a_,b_,theta_] |
Hyperbola2D[{h_,k_},a_,b_,theta_],
Point2D[{xA_,yA_}],
{Point2D[{x0_,y0_}],Point2D[{x1_,y1_}]}] :=
Module[{xM,yM},
{xM,yM}={x0+x1,y0+y1}/2;
If[IsZero2D[h-xM],
1/(1+Sqrt[k-yA]/Sqrt[k-yM]),
1/(1+Sqrt[h-xA]/Sqrt[h-xM])] //Simplify ];
For central conics (circles, ellipses and hyperbolas) there is a restriction that the center point
cannot be on the line defining the chord of the conic arc.
ConicArc2D[L1:Line2D[a1_,b1_,c1_],
C2_ /; Is2D[C2,{Circle2D,Ellipse2D,Hyperbola2D}]] :=
If[IsOn2D[Point2D[C2],L1],
Message[ConicArc2D::center,L1,C2];$Failed,
CnArc$2D[L1,C2,Points2D[L1,C2]]];
Non-central conics (parabolas) have no restrictions on the position of the line defining the
chord of the conic arc.
ConicArc2D[L1:Line2D[a1_,b1_,c1_],C2:Parabola2D[{h_,k_},f_,theta_]] :=
CnArc$2D[L1,C2,Points2D[L1,C2]];
Both end points of the chord of the conic arc must be on the same branch of a hyperbola.
CnArc$2D[L1:Line2D[a1_,b1_,c1_],
H2:Hyperbola2D[{h_,k_},a_,b_,theta_],
{Point2D[{x0_,y0_}],Point2D[{x1_,y1_}]}] :=
(Message[ConicArc2D::noChord,L1,H2];$Failed) /;
IsNegative2D[Polynomial2D[Quadratic2D[H2],{x0+x1,y0+y1}/2]];
The private function CnArc$2D[line, curve, {point, point}] completes the computation of the
conic arc.
CnArc$2D[L1:Line2D[a1_,b1_,c1_],C2_,
P:{Point2D[{x0_,y0_}],Point2D[{x1_,y1_}]}] :=
Module[{pt},
pt=Point2D[L1,C2];
ConicArc2D[{x0,y0},Coordinates2D[pt],{x1,y1},FindRho$2D[C2,pt,P]] ];
No conic arc exists if the intersection of the line and the curve does not result in two points.
CnArc$2D[L1:Line2D[a1_,b1_,c1_],C2_,pts_] :=
(Message[ConicArc2D::noChord,L1,C2];$Failed)
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DConicArc2D‘" *)
D2DEllipse2D
Initialization
BeginPackage["D2DEllipse2D‘",{"D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSegment2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DEllipse2D::usage=
"D2DEllipse2D is a package that implements the Ellipse2D object.";
Ellipse2D::usage=
"Ellipse2D[{h,k},a,b,theta] is the standard form of an ellipse centered
at (h,k), semi-major axis length ’a’, semi-minor axis length ’b’ and
rotation angle ’theta’.";
SemiMajorAxis2D::usage=
"SemiMajorAxis2D[ellipse] returns the length of the semi-major axis of
an ellipse.";
SemiMinorAxis2D::usage=
"SemiMinorAxis2D[ellipse] returns the length of the semi-minor axis of
an ellipse.";
Begin["‘Private‘"];
Description
Representation
Ellipse2D[{h, k}, a, b, θ] Standard representation of an ellipse in Descarta2D. The first
argument is a list of coordinates representing the center of the ellipse. The second and third
arguments are (positive) scalars representing the lengths of the semi-major and semi-minor
axes of the ellipse. The fourth argument is the counter-clockwise rotation angle (in radians)
of the ellipse about the center point.
421
422 D2DEllipse2D - Description
Equation
Quadratic2D[ellipse] Constructs a quadratic representing the equation of an ellipse.
Quadratic2D[Ellipse2D[{h_,k_},a_,b_,theta_]] :=
Rotate2D[
Quadratic2D[b^2,0,a^2,-2*b^2*h,-2*a^2*k,-a^2*b^2+b^2*h^2+a^2*k^2],
theta,
{h,k}];
Evaluation
Ellipse2D[{h, k}, a, b, θ][θ1 ] Evaluates a position on an ellipse at parameter θ1 and
returns a list of coordinates {x, y}. Parameters in the range 0 ≤ θ1 < 2π cover the entire
ellipse.
Ellipse2D[{h_,k_},a_,b_,theta_][t_?IsScalar2D] :=
Rotate2D[{h+a*Cos[t],k+b*Sin[t]},theta,{h,k}];
Graphics
Provides the graphics primitives for an ellipse by extending the Mathematica Display com-
mand. Executed when the package is loaded.
SetDisplay2D[
Ellipse2D[{h_,k_},a_,b_,t_][{t1_?IsScalar2D,t2_?IsScalar2D}],
MakePrimitives2D[Ellipse2D[{h,k},a,b,t],
PrimaryAngleRange2D[{t1,t2}]] ];
SetDisplay2D[
Ellipse2D[{h_,k_},a_,b_,t_],
MakePrimitives2D[Ellipse2D[{h,k},a,b,t],{0,2Pi}] ];
Validation
Ellipse2D[{h, k}, a, b, θ] Detects an ellipse with imaginary arguments and returns the
$Failed symbol. If the imaginary parts are insignificant, they are removed.
Ellipse2D::imaginary=
"An invalid ellipse of the form ’Ellipse2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has been
detected; the arguments of an ellipse cannot involve imaginary numbers.";
Ellipse2D[{h_,k_},a_,b_,theta_] :=
(Ellipse2D @@ ChopImaginary2D[Ellipse$2D[{h,k},a,b,theta]]) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsTinyImaginary2D[{h,k,a,b,theta}]);
Ellipse2D[{h_,k_},a_,b_,theta_] :=
(Message[Ellipse2D::imaginary,{h,k},a,b,theta];$Failed) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsComplex2D[{h,k,a,b,theta},0]);
D2DEllipse2D - Scalars 423
Ellipse2D[{h, k}, a, b, θ] Detects an ellipse with invalid arguments and returns the
$Failed symbol.
Ellipse2D::invalid=
"An invalid ellipse of the form ’Ellipse2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has been
detected; the length of both the semi-major and semi-minor axes must be
positive.";
Ellipse2D[{h_,k_},a_,b_,theta_] :=
(Message[Ellipse2D::invalid,{h,k},a,b,theta];$Failed) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsZeroOrNegative2D[{a,b},0]);
Ellipse2D[{h, k}, a, b, θ] Normalizes the rotation angle on all ellipses to the range
0 ≤ θ < π.
Ellipse2D[{h_,k_},a_,b_,theta_] :=
Ellipse2D[{h,k},a,b,PrimaryAngle2D[theta,Pi]] /;
(FreeQ[{h,k,a,b,theta},_Pattern] && (theta=!=PrimaryAngle2D[theta,Pi]));
Scalars
Angle of Rotation
Angle2D[ellipse] Returns the rotation angle of an ellipse.
Angle2D[Ellipse2D[{h_,k_},a_,b_,theta_]] := theta;
Transformations
Reflect
Reflect2D[ellipse, line] Reflects an ellipse in a line.
Reflect2D[Ellipse2D[{h_,k_},a_,b_,theta_],L:Line2D[p_,q_,r_]] :=
Ellipse2D[Reflect2D[{h,k},L],a,b,ReflectAngle2D[theta,L]];
Rotate
Rotate2D[ellipse, θ, coords] Rotates an ellipse by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Ellipse2D[{h_,k_},a_,b_,theta_],alpha_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Ellipse2D[Rotate2D[{h,k},alpha,{x0,y0}],a,b,alpha+theta];
Scale
Scale2D[ellipse, s, coords] Scales an ellipse by a scale factor, s, from a position given by
coordinates. If the position is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Ellipse2D[{h_,k_},a_,b_,theta_],s_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Ellipse2D[Scale2D[{h,k},s,{x0,y0}],s*a,s*b,theta] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[ellipse, {u, v}] Translates an ellipse delta distance.
Translate2D[Ellipse2D[{h_,k_},a_,b_,theta_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Ellipse2D[{h+u,k+v},a,b,theta];
Point Construction
Center Point
Point2D[ellipse] Constructs the center point of an ellipse.
Point2D[Ellipse2D[{h_,k_},a_,b_,theta_]] := Point2D[{h,k}];
D2DEllipse2D - Line Construction 425
Pole Point
Point2D[line, ellipse] Constructs the pole point of a line with respect to an ellipse. If the
line is tangent to the ellipse then the point is the point of tangency.
Point2D[L1:Line2D[a1_,b1_,c1_],E2:Ellipse2D[{h2_,k2_},a2_,b2_,theta2_]] :=
Point2D[L1,Quadratic2D[E2]];
Line Construction
Axis Line
Line2D[ellipse] Constructs a line containing the major axis of an ellipse.
Line2D[Ellipse2D[{h_,k_},a_,b_,theta_]] :=
Rotate2D[Line2D[0,1,-k],theta,{h,k}];
Polar Line
Line2D[point, ellipse] Constructs the polar (line) of a pole (point) with respect to an
ellipse. If the point is on the ellipse then the line is tangent to the ellipse at the point.
Line2D[P1:Point2D[{x1_,y1_}],E2:Ellipse2D[{h2_,k2_},a2_,b2_,theta2_]] :=
Line2D[P1,Quadratic2D[E2]];
Ellipse Construction
Ellipse from Vertices and Eccentricity
Ellipse2D[{point, point}, e] Constructs an ellipse from the vertices and eccentricity.
Ellipse2D::invdef=
"The defining geometry or eccentricity is invalid; the eccentricity of
an ellipse must be in the range 0<e<1, the foci and vertices cannot be
coincident, and the focus cannot lie on the directrix.";
Ellipse2D[{P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}]},e_?IsScalar2D] :=
Module[{a,b,h,k},
If[IsZeroOrNegative2D[{e,1-e},Or] || IsCoincident2D[P1,P2],
Message[Ellipse2D::invdef];$Failed,
a=Distance2D[P1,P2]/2;
b=a*Sqrt[1-e^2];
{h,k}={(x1+x2)/2,(y1+y2)/2};
Ellipse2D[{h,k},a,b,ArcTan[x2-x1,y2-y1]]] ];
426 D2DEllipse2D - Epilogue
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DEllipse2D‘" *)
D2DEquations2D
The package D2DEquations2D provides functions for converting Mathematica equations and
polynomials into Descarta2D lines and quadratics, and vice versa.
Initialization
BeginPackage["D2DEquations2D‘", {"D2DExpressions2D‘", "D2DLine2D‘",
"D2DQuadratic2D‘"}];
D2DEquations2D::usage=
"D2DEquations2D is a package that provides functions for converting
Mathematica polynomials and equations into lines and quadratics, and vice
versa.";
Equation2D::usage=
"Equation2D[line, {x,y}] forms a linear equation in two unknowns, a*x +
b*y + c == 0; Equation2D[quad, {x,y}] forms a quadratic equation in two
unknowns, a*x^2 + b*x*y + c*y^2 + d*x + e*y + f == 0.";
Polynomial2D::usage=
"Polynomial2D[line, {x,y}] forms a linear polynomial in two unknowns,
a*x + b*y + c; Polynomial2D[quad, {x,y}] forms a quadratic polynomial in
two unknowns, a*x^2 + b*x*y + c*y^2 + d*x + e*y + f.";
SimplifyCoefficients2D::usage=
"SimplifyCoefficients2D[coefList] returns a list of coefficients with
common factors removed.";
Begin["‘Private‘"];
Coefficients
Simplify Coefficients
SimplifyCoefficients2D[coefList] Returns a list of coefficients with common factors
removed.
427
428 D2DEquations2D - Epilogue
SimplifyCoefficients2D[coef:{c1_?IsScalar2D,c2__?IsScalar2D}] :=
Module[{gcd,coef1},
gcd=PolynomialGCD[Sequence @@ Rationalize[coef]];
If[IsZero2D[gcd], gcd=1];
coef1=Map[Simplify[#/gcd]&,coef];
Map[If[IsZero2D[Round[#]-#],Round[#],#]&,coef1] ];
Equations
Linear
Equation2D[line, {x, y}] Forms ax + by + c == 0 from a line.
Equation2D[Line2D[a_,b_,c_],{x_?IsScalar2D,y_?IsScalar2D}] := a*x+b*y+c==0;
Quadratic
Equation2D[quad, {x, y}] Forms ax2 + bxy + cy 2 + dx + ey + f == 0 from a quadratic.
Equation2D[Quadratic2D[a_,b_,c_,d_,e_,f_],{x_?IsScalar2D,y_?IsScalar2D}] :=
a*x^2+b*x*y+c*y^2+d*x+e*y+f==0;
Polynomials
Linear
Polynomial2D[line, {x, y}] Forms ax + by + c from a line.
Polynomial2D[Line2D[a_,b_,c_],{x_?IsScalar2D,y_?IsScalar2D}] := a*x+b*y+c;
Quadratic
Polynomial2D[quad, {x, y}] Forms ax2 + bxy + cy 2 + dx + ey + f from a quadratic.
Polynomial2D[Quadratic2D[a_,b_,c_,d_,e_,f_],
{x_?IsScalar2D,y_?IsScalar2D}] :=
a*x^2+b*x*y+c*y^2+d*x+e*y+f;
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DEquations2D‘" *)
D2DExpressions2D
Initialization
BeginPackage["D2DExpressions2D‘", {"D2DMaster2D‘", "D2DNumbers2D‘"}];
D2DExpressions2D::usage=
"D2DExpressions2D is a package for querying Mathematica expressions.";
IsApproximate2D::usage=
"IsApproximate2D[expr] returns ’True’ if the expression contains
approximate real numbers, or if the evaluation will eventually be
approximated using the ’N’ function.";
IsComplex2D::usage=
"IsComplex2D[expr,(tol)] returns ’True’ if the expression evaluates to a
complex number; IsComplex2D[List,(tol)] and IsComplex2D[List,Or,(tol)]
return ’True’ if any expressions in the list evaluate to complex numbers;
IsComplex2D[List,And,(tol)] returns ’True’ if all the expressions in the
list evaluate to complex numbers; the default tolerance, if omitted, is
10^(-10).";
IsNegative2D::usage=
"IsNegative2D[expr,(tol)] returns ’True’ if the expression is negative;
otherwise, returns ’False’; IsNegative2D[List,(tol)] and
IsNegative2D[List,Or,(tol)] return ’True’ if any expressions in the list
are negative; IsNegative2D[List,And,(tol)] returns ’True’ if all the
expressions in the list are negative; the default tolerance, if omitted, is
10^(-10).";
IsNumeric2D::usage=
"IsNumeric2D[expr,(tol)] returns ’True’ if the expression consists of
atoms that can be evaluated to real numbers;
IsNumeric2D[expr,funcName,(tol)] provides the same function with a message;
the default tolerance, if omitted, is 10^(-10).";
IsReal2D::usage=
"IsReal2D[expr,(tol)] returns ’True’ if the expression is real-valued;
otherwise, returns ’False’; the default tolerance, if omitted, is
10^(-10).";
429
430 D2DExpressions2D - Utilities
IsScalar2D::usage=
"IsScalar2D[expr] returns ’True’ if the expression appears to be a
scalar (not a List, object, or complex number); otherwise, returns
’False’.";
IsScalarPair2D::usage=
"IsScalarPair2D[{expr1,expr2}] returns ’True’ if both expressions in a
list appear to be a scalars (not a Lists, objects, or complex numbers);
otherwise, returns ’False’.";
IsTinyImaginary2D::usage=
"IsTinyImaginary2D[expr,(tol)] returns ’True’ if any complex numbers in
the expression have tiny imaginary parts; the default tolerance, if
omitted, is 10^(-10).";
IsZero2D::usage=
"IsZero2D[expr,(tol)] returns ’True’ if the expression is zero;
otherwise, returns ’False’; IsZero2D[List,(tol)] and
IsZero2D[List,Or,(tol)] return ’True’ if any expressions in the list are
zero; IsZero2D[List,And,(tol)] returns ’True’ if all the expressions in the
list are zero; the default tolerance, if omitted, is 10^(-10).";
IsZeroOrNegative2D::usage=
"IsZeroOrNegative2D[expr,(tol)] returns ’True’ if the expression is zero
or negative; otherwise, returns ’False’; IsZeroOrNegative2D[List,(tol)] and
IsZeroOrNegative2D[List,Or,(tol)] return ’True’ if any expressions in the
list are zero or negative; IsZeroOrNegative2D[List,And,(tol)] returns
’True’ if all the expressions in the list are zero or negative; the default
tolerance, if omitted, is 10^(-10).";
Begin["‘Private‘"];
Utilities
Chop
The built-in Mathematica function Chop issues an error message if the tolerance is zero. These
modifications to the Chop function allow a zero tolerance to be specified. Executed when the
package is loaded.
protected=Unprotect[Chop];
Chop[expr_,0] := expr;
Chop[expr_,0.] := expr;
Protect[Evaluate[protected]];
Random Evaluation
The private function RandomEvaluation$2D substitutes random numbers for the non-numeric
symbols in the expression and applies the N function to the result. This is useful for determining
whether a symbolic expression represents some specific numerical value (such as zero). There is
a small probability that an erroneous conclusion may be reached if an unfortunate combination
of random numbers arises.
D2DExpressions2D - Number Queries 431
RandomEvaluation$2D[expr_] :=
Module[{atoms,symbols,rules},
atoms=Level[N[expr],{-1}];
symbols=Union[Select[atoms,(Head[#]===Symbol)&]];
rules=Map[Rule[#,Random[Real,{0.1,0.9}]]&,symbols];
N[expr /. rules] ];
Tolerance
The private function Tolerance$2D[tol] returns tol if it is a valid tolerance value; otherwise,
issues a warning message and returns the default tolerance value, 10−10 . The special cases are
provided to improve the performance of heavily used tolerance values.
D2DExpressions2D::badTol=
"The tolerance ‘1‘ is not a valid tolerance specification; the default
tolerance, 10^(-10), will be used.";
Tolerance$2D[10^(-10)] := 10^(-10);
Tolerance$2D[0] := 0;
Tolerance$2D[tol_] :=
If[TrueQ[N[tol]>=0],
tol,
Message[D2DExpressions2D::badTol,tol];10^(-10)];
Number Queries
Approximate Query
IsApproximate2D[expr] Returns True if any of the atoms in an expression are approximate
real numbers or if the N function will eventually be applied to the expression; otherwise, returns
False.
IsApproximate2D[expr_] :=
(Not[FreeQ[expr,_Real]] || Stack[N[___]]=!={});
Complex Query
IsComplex2D[expr, (tol)] Returns True if an expression evaluates numerically to a complex
number; otherwise, returns False. The heavily used cases are provided to improve perfor-
mance. The default tolerance, if omitted, is 10−10 .
IsComplex2D[n_Real,tol_:(10^(-10))] := False;
IsComplex2D[n_Integer,tol_:(10^(-10))] := False;
IsComplex2D[n_Rational,tol_:(10^(-10))] := False;
432 D2DExpressions2D - Number Queries
IsComplex2D[sym_Symbol,tol_:(10^(-10))] := False;
IsComplex2D[n_Complex,tol_:(10^(-10))] := Abs[Im[n]]>Tolerance$2D[tol];
IsComplex2D[expr_,tol_:(10^(-10))] :=
Module[{n,tol1},
tol1=Tolerance$2D[tol];
n=Chop[N[expr],tol1];
Head[n]===Complex ] /;
(Head[expr] =!= List);
IsComplex2D[expr_List,bool_:Or,tol_:(10^(-10))] :=
Module[{tol1},
tol1=Tolerance$2D[tol];
bool @@ Map[IsComplex2D[#,tol1]&,expr] ] /;
(bool==And || bool==Or);
Numeric Query
IsNumeric2D[expr, (tol)] Returns True if all the atoms in an expression can be evaluated
to real numbers; otherwise, returns False. The default tolerance, if omitted, is 10−10 .
IsNumeric2D[expr_,tol_:(10^(-10))] :=
Not[MemberQ[Chop[expr//N,Tolerance$2D[tol]],
(_Symbol | _Complex | _String),{-1}]] /;
(Head[tol] =!= Symbol);
IsNumeric2D[expr_,funcName_Symbol,tol_:(10^(-10))] :=
If[IsNumeric2D[expr,Tolerance$2D[tol]],
True,
Message[IsNumeric2D::notNumeric,funcName];False];
D2DExpressions2D - Number Queries 433
Real Query
IsReal2D[expr, (tol)] Returns True if the expression can be evaluated to a real number;
otherwise, returns False. A complex number with an insignificant imaginary component will
return True. The default tolerance, if omitted, is 10−10 .
IsReal2D[expr_Real,___] := True;
IsReal2D[expr_Integer,___] := True;
IsReal2D[expr_Symbol,___] := False;
IsReal2D[expr_Rational,___] := True;
IsReal2D[expr_Complex,tol_:(10^(-10))] :=
Chop[Im[expr]//N,Tolerance$2D[tol]]===0;
IsReal2D[expr_,tol_:(10^(-10))] :=
Module[{n},
n=Chop[N[expr],Tolerance$2D[tol]];
(NumberQ[n] && (Im[n]==0))];
Scalar Query
IsScalar2D[n] Returns True if an expression appears to be a scalar quantity—that is,
it cannot be recognized as Null, a list, a complex number or a Descarta2D object; otherwise,
returns False. The special cases for Real, Integer and Symbol are provided to improve the
performance of heavily used queries.
IsScalar2D[_Real] := True;
IsScalar2D[_Integer] := True;
IsScalar2D[_Symbol] := True;
IsScalar2D[_List] := False;
IsScalar2D[_?IsComplex2D] := False;
IsScalar2D[Null] := False;
IsScalar2D[expr_] := False /;
MemberQ[ObjectNames2D[],ToString[Head[expr]]];
IsScalar2D[expr_] := False /;
Not[FreeQ[expr,_Pattern]];
IsScalar2D[expr_] := True;
434 D2DExpressions2D - Sign Queries
IsScalarPair2D[___] := False;
IsTinyImaginary2D[expr_,tol_:(10^(-10))] :=
Module[{tol1},
tol1=Tolerance$2D[tol];
Or @@ Map[(Head[#]===Complex && Chop[Im[#],tol1]===0)&,
Level[expr,{-1}]] ];
Sign Queries
Negative Query
IsNegative2D[expr, (tol)] Returns True if a number is numerically negative; otherwise
returns False. The default tolerance, if omitted, is 10−10 .
IsNegative2D[expr_,tol_:(10^(-10))] :=
Module[{n},
n=Chop[N[expr],Tolerance$2D[tol]];
If[MemberQ[{Real,Integer},Head[n]], n<0, False] ] /;
(Head[expr] =!= List);
IsNegative2D[expr_List,bool_:Or,tol_:(10^(-10))] :=
Module[{tol1},
tol1=Tolerance$2D[tol];
bool @@ Map[IsNegative2D[#,tol1]&,expr] ] /;
(bool==And || bool==Or);
D2DExpressions2D - Sign Queries 435
Zero Query
IsZero2D[expr, (tol)] Returns True if an expression is numerically zero; otherwise, returns
False. The heavily used cases are provided as special cases to improve performance. The
default tolerance, if omitted or invalid, is 10−10 .
IsZero2D[n_Real,tol_:(10^(-10))] := (Abs[n]<=Tolerance$2D[tol]);
IsZero2D[n_Integer,tol_:(10^(-10))] := (Abs[n]<=Tolerance$2D[tol]);
IsZero2D[expr_Symbol,tol_:(10^(-10))] := False;
IsZero2D[n_Complex,tol_:(10^(-10))] :=
Module[{tol1},
tol1=Tolerance$2D[tol];
(Abs[Re[n]]<=tol1 && Abs[Im[n]]<=tol1)];
IsZero2D[h_[___],tol_:(10^(-10))] := False /;
MemberQ[ObjectNames2D[],ToString[h]];
IsZero2D[expr_,tol_:(10^(-10))] :=
Module[{n,tol1},
tol1=Tolerance$2D[tol];
n=Chop[N[expr],tol1];
If[MemberQ[{Real,Integer,Complex},Head[n]],
IsZero2D[n,tol1],
Chop[RandomEvaluation$2D[n],tol1]===0] ] /;
(Head[expr] =!= List);
IsZeroOrNegative2D[expr_List,bool_:Or,tol_:(10^(-10))] :=
Module[{tol1},
tol1=Tolerance$2D[tol];
bool @@ Map[IsZeroOrNegative2D[#,tol1]&,expr] ] /;
(bool==And || bool==Or);
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DExpressions2D‘" *)
D2DGeometry2D
Initialization
BeginPackage["D2DGeometry2D‘",{"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DPoint2D‘", "D2DQuadratic2D‘"}];
D2DGeometry2D::usage=
"D2DGeometry2D is a package providing various geometric queries.";
IsCoincident2D::usage=
"IsCoincident2D[obj1,obj2] returns ’True’ if the two objects are
coincident; IsCoincident2D[obj_List] returns ’True’ if any pair of objects
in the list is coincident (coordinates, points, lines, circles or
quadratics).";
IsCollinear2D::usage=
"IsCollinear2D[point,point,point] returns ’True’ if the three points are
collinear; IsCollinear2D[pt_List] returns ’True’ if any triple of points in
the list are collinear.";
IsConcentric2D::usage=
"IsConcentric2D[circle,circle] returns ’True’ if the two circles are
concentric; IsConcentric2D[cir_List] returns ’True’ if any pair of circles
in the list are concentric.";
IsConcurrent2D::usage=
"IsConcurrent2D[line,line,line] returns ’True’ if the three lines are
concurrent; IsConcurrent2D[ln_List] returns ’True’ if any triple of lines
in the list is concurrent.";
IsOn2D::usage=
"IsOn2D[point,line | circle | quad] returns ’True’ if the point is on
the line, circle or quadratic.";
IsParallel2D::usage=
"IsParallel2D[line,line] returns ’True’ if two lines are parallel;
IsParallel2D[ln_List] returns ’True’ if any pair of lines in a list is
parallel.";
437
438 D2DGeometry2D - Utilities
IsTripleParallel2D::usage=
"IsTripleParallel2D[line,line,line] returns ’True’ if three lines are
parallel; IsTripleParallel2D[ln_List] returns ’True’ if any triple of lines
in a list is parallel.";
IsPerpendicular2D::usage=
"IsPerpendicular2D[line,line] returns ’True’ if two lines are
perpendicular; IsPerpendicular2D[ln_List] returns ’True’ if any pair of
lines in a list is perpendicular.";
IsTangent2D::usage=
"IsTangent2D[line,circle] returns ’True’ if a line is tangent to a
circle; IsTangent2D[circle,circle] returns ’True’ if two circles are
tangent to each other; IsTangent2D[line,quad] returns ’True’ if a line is
tangent to a quadratic.";
Begin["‘Private‘"];
Utilities
Combinations
The private functions PairQ$2D, Pairs$2D, TripleQ$2D and Triples$2D are used to apply
queries over lists of objects.
Pairs$2D[{a_,b_}] := {{a,b}};
Pairs$2D[{a_,b_,c__}] :=
Flatten[{Map[{a,#}&,{b,c}],Pairs$2D[{b,c}]},1];
Pairs$2D[L_List /; Length[L]<2] := L;
Triples$2D[{a_,b_,c_}] := {{a,b,c}};
Triples$2D[{a_,b_,c_,d__}] :=
Flatten[{Map[({a,#[[1]],#[[2]]})&,Pairs$2D[{b,c,d}]],
Triples$2D[{b,c,d}]},1];
Triples$2D[L_List /; Length[L]<3] := L;
PairQ$2D[L:{a_,b__},func_] :=
MemberQ[Map[func[#[[1]],#[[2]]]&,
Pairs$2D[L]],
True];
PairQ$2D[{___},func_] := False;
TripleQ$2D[L:{a_,b_,c__},func_] :=
MemberQ[Map[func[#[[1]],#[[2]],#[[3]]]&,
Triples$2D[L]],
True];
TripleQ$2D[{___},func_] := False;
D2DGeometry2D - Coincident Queries 439
Coincident Queries
Two Coordinates
IsCoincident2D[coords, coords] Returns True if two coordinates are coincident; otherwise,
returns False.
IsCoincident2D[{x1_?IsScalar2D,y1_?IsScalar2D},
{x2_?IsScalar2D,y2_?IsScalar2D}] :=
IsZero2D[x1-x2] && IsZero2D[y1-y2];
Two Points
IsCoincident2D[point, point] Returns True if two points are coincident; otherwise, returns
False.
IsCoincident2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}]] :=
IsZero2D[x1-x2] && IsZero2D[y1-y2];
Two Lines
IsCoincident2D[line, line] Returns True if two lines are coincident; otherwise, returns
False.
IsCoincident2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_]] :=
IsZero2D[{Det[{{ a1, b1},{ a2, b2}}],
Det[{{-c1, b1},{-c2, b2}}],
Det[{{ a1,-c1},{ a2,-c2}}]},And]
Two Circles
IsCoincident2D[circle, circle] Returns True if two circles are coincident; otherwise,
returns False.
IsCoincident2D[Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_]] :=
IsCoincident2D[{h1,k1},{h2,k2}] && IsZero2D[r1-r2];
Two Quadratics
IsCoincident2D[quad, quad] Returns True if two quadratics are coincident; otherwise,
returns False.
IsCoincident2D[Q1:Quadratic2D[a1_,b1_,c1_,d1_,e1_,f1_],
Q2:Quadratic2D[a2_,b2_,c2_,d2_,e2_,f2_]] :=
Module[{k1,k2},
{k1}=Select[List @@ Q1,Not[IsZero2D[#]]&,1];
{k2}=Select[List @@ Q2,Not[IsZero2D[#]]&,1];
IsZero2D[Map[Simplify[Expand[N[#]]]&,
{a1*k2-a2*k1,b1*k2-b2*k1,c1*k2-c2*k1,
d1*k2-d2*k1,e1*k2-e2*k1,f1*k2-f2*k1}],
And] ];
440 D2DGeometry2D - Concentric Queries
List of Objects
IsCoincident2D[objList] Returns True if any pair of objects (points, lines, circles or
quadratics) in a list are coincident; otherwise, returns False.
IsCoincident2D[obj_List] := PairQ$2D[obj,IsCoincident2D];
Collinear Queries
Three Points
IsCollinear2D[point, point, point] Returns True if three points are collinear; otherwise,
returns False.
IsCollinear2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}],Point2D[{x3_,y3_}]] :=
IsZero2D[Det[{{x1,y1,1},{x2,y2,1},{x3,y3,1}}]];
List of Points
IsCollinear2D[ptsList] Returns True if any combination of three points in a list are
collinear; otherwise, returns False.
IsCollinear2D[pts_List] := TripleQ$2D[pts,IsCollinear2D];
Concentric Queries
Two Circles
IsConcentric2D[circle, circle] Returns True if two circles are concentric; otherwise,
returns False.
IsConcentric2D[Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_]] :=
IsCoincident2D[{h1,k1},{h2,k2}];
List of Circles
IsConcentric2D[cirList] Returns True if any combination of two circles in a list are
concentric; otherwise, returns False.
IsConcentric2D[cir_List] := PairQ$2D[cir,IsConcentric2D];
D2DGeometry2D - Concurrent Queries 441
Concurrent Queries
Three Lines
IsConcurrent2D[line, line, line] Returns True if three given lines are concurrent; oth-
erwise, returns False. Coincident and parallel lines are not considered to be concurrent and
will return False.
IsConcurrent2D[L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_],
L3:Line2D[a3_,b3_,c3_]] :=
IsZero2D[Det[{{a1,b1,c1},{a2,b2,c2},{a3,b3,c3}}]] &&
Not[IsParallel2D[L1,L2]] && Not[IsParallel2D[L2,L3]] &&
Not[IsParallel2D[L2,L3]];
List of Lines
IsConcurrent2D[lnsList] Returns True if any combination of three lines in a list are
concurrent; otherwise, returns False. Coincident and parallel lines are not considered to be
concurrent and will return False.
IsConcurrent2D[lns_List] := TripleQ$2D[lns,IsConcurrent2D];
On Queries
Point On Line
IsOn2D[point, line] Returns True if a point is on a line; otherwise, returns False.
IsOn2D[Point2D[{x1_,y1_}],Line2D[a2_,b2_,c2_]] := IsZero2D[a2*x1+b2*y1+c2];
Point On Circle
IsOn2D[point, circle] Returns True if a point is on a circle; otherwise, returns False.
IsOn2D[Point2D[{x1_,y1_}],Circle2D[{h2_,k2_},r2_]] :=
IsZero2D[(x1-h2)^2+(y1-k2)^2-r2^2];
Point On Quadratic
IsOn2D[point, quad] Returns True if a point is on a quadratic; otherwise, returns False.
IsOn2D[Point2D[{x_,y_}],Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
IsZero2D[a*x^2+b*x*y+c*y^2+d*x+e*y+f];
442 D2DGeometry2D - Perpendicular Queries
Parallel Queries
Two Lines
IsParallel2D[line, line] Returns True if two lines are parallel, otherwise, returns False.
IsParallel2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_]] :=
IsZero2D[a1*b2-a2*b1];
IsParallel2D[lns_List] := PairQ$2D[lns,IsParallel2D];
Three Lines
IsTripleParallel2D[line, line, line] Returns True if three lines are mutually parallel;
otherwise, returns False.
IsTripleParallel2D[Line2D[a1_,b1_,c1_],
Line2D[a2_,b2_,c2_],
Line2D[a3_,b3_,c3_]] :=
IsZero2D[a1*b2-a2*b1] && IsZero2D[a2*b3-a3*b2];
IsTripleParallel2D[lns_List] := TripleQ$2D[lns,IsTripleParallel2D];
Perpendicular Queries
Two Lines
IsPerpendicular2D[line, line] Returns True if two lines are perpendicular; otherwise,
returns False.
IsPerpendicular2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_]] :=
IsZero2D[a1*a2+b1*b2];
D2DGeometry2D - Tangent Queries 443
List of Lines
IsPerpendicular2D[lnsList] Returns True if any combination of two lines in a list is
perpendicular; otherwise, returns False.
IsPerpendicular2D[lns_List] := PairQ$2D[lns,IsPerpendicular2D];
Tangent Queries
Line and Circle
IsTangent2D[line, circle] Returns True if a line is tangent to a circle; otherwise, returns
False.
IsTangent2D[Line2D[A1_,B1_,C1_],Circle2D[{h_,k_},r_]] :=
IsZero2D[r^2*(A1^2+B1^2)-(C1+A1*h+B1*k)^2];
Two Circles
IsTangent2D[circle, circle] Returns True if two circles are tangent to each other; otherwise,
returns False.
IsTangent2D[C1:Circle2D[{h1_,k1_},r1_],C2:Circle2D[{h2_,k2_},r2_]] :=
Module[{d},
d=(h1-h2)^2+(k1-k2)^2;
IsZero2D[{d-(r1+r2)^2,d-(r1-r2)^2},Or] &&
Not[IsCoincident2D[C1,C2]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DGeometry2D‘" *)
D2DHyperbola2D
Initialization
BeginPackage["D2DHyperbola2D‘",{"D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSegment2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DHyperbola2D::usage=
"’D2DHyperbola2D’ is a package providing support for hyperbolas.";
Conjugate2D::usage=
"Conjugate2D is a keyword used to construct a conjugate hyperbola in
Hyperbola2D[hyperbola, Conjugate2D].";
Hyperbola2D::usage=
"Hyperbola2D[{h,k},a,b,theta] is the standard form of a hyperbola,
centered at (h,k), semi-transverse axis length ’a’, semi-conjugate axis ’b’
and rotation angle ’theta’.";
SemiConjugateAxis2D::usage=
"SemiConjugateAxis2D[hyperbola] returns the length of the semi-conjugate
axis of a hyperbola.";
SemiTransverseAxis2D::usage=
"SemiTransverseAxis2D[hyperbola] returns the length of the
semi-transverse axis of a hyperbola.";
Begin["‘Private‘"];
Description
Representation
Hyperbola2D[{h, k}, a, b, θ] Standard representation of a hyperbola in Descarta2D. The
first argument is a list of coordinates representing the center of the hyperbola. The second
and third arguments are (positive) scalars representing the lengths of the semi-transverse and
semi-conjugate axes. The fourth argument is the counter-clockwise rotation (in radians) of
the hyperbola about the center point.
445
446 D2DHyperbola2D - Description
Equation
Quadratic2D[hyperbola] Constructs the quadratic representing the equation of a hyperbola.
Quadratic2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Rotate2D[
Quadratic2D[b^2,0,-a^2,-2*b^2*h,2*a^2*k,-a^2*b^2+b^2*h^2-a^2*k^2],
theta,{h,k}];
Evaluation
Hyperbola2D[{h, k}, a, b, θ, False | True][t] Evaluates the primary branch of a hyper-
bola (when the keyword is False or omitted) or its reflection (when the keyword is True).
The primary branch is the one opening about the +x-axis when the rotation angle is zero.
The end points of the focal chords are at parameter values −1 and +1.
Hyperbola2D[{h_,k_},a_,b_,theta_,reflection_:False][t_?IsScalar2D] :=
Module[{alpha,e,s},
alpha=If[reflection==False,0,Pi];
e=Sqrt[a^2+b^2]/a;
s=ArcCosh[e];
Rotate2D[{h+a*Cosh[s*t],k+b*Sinh[s*t]},theta+alpha,{h,k}] ] /;
MemberQ[{True,False},reflection];
Graphics
Provides graphics for a hyperbola by extending the Mathematica Display command. Executed
when the package is loaded.
SetDisplay2D[
Hyperbola2D[{h_,k_},a_,b_,t_][{t1_?IsScalar2D,t2_?IsScalar2D}] /;
t1<=t2,
MakePrimitives2D[
Hyperbola2D[{h,k},a,b,t,False],{t1,t2}] ];
SetDisplay2D[
Hyperbola2D[{h_,k_},a_,b_,t_][{t1_?IsScalar2D,t2_?IsScalar2D}] /;
t1>t2,
MakePrimitives2D[
Hyperbola2D[{h,k},a,b,t,True],{t2,t1}] ];
SetDisplay2D[
Hyperbola2D[{h_,k_},a_,b_,t_],
Map[MakePrimitives2D[
Hyperbola2D[{h,k},a,b,t,#],
CurveLimits2D[{a,0},Hyperbola2D[{0,0},a,b,0]]]&,
{False,True}] ];
D2DHyperbola2D - Description 447
Validation
Hyperbola2D[{h, k}, a, b, θ] Detects a hyperbola with imaginary arguments and returns
the $Failed symbol. If the imaginary parts are insignificant, they are removed.
Hyperbola2D::imaginary=
"An invalid hyperbola of the form ’Hyperbola2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ has
been detected; the arguments cannot be imaginary.";
Hyperbola2D[{h_,k_},a_,b_,theta_] :=
(Hyperbola2D @@ ChopImaginary2D[Hyperbola$2D[{h,k},a,b,theta]]) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsTinyImaginary2D[{h,k,a,b,theta}]);
Hyperbola2D[{h_,k_},a_,b_,theta_] :=
(Message[Hyperbola2D::imaginary,{h,k},a,b,theta];$Failed) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsComplex2D[{h,k,a,b,theta},0]);
Hyperbola2D[{h, k}, a, b, θ] Detects a hyperbola with invalid arguments and returns the
$Failed symbol.
Hyperbola2D::invalid=
"An invalid hyperbola of the form ’Hyperbola2D[‘1‘, ‘2‘, ‘3‘, ‘4‘]’ was
encountered; the lengths of the semi-transverse and semi-conjugate axes
must be positive.";
Hyperbola2D[{h_,k_},a_,b_,theta_] :=
(Message[Hyperbola2D::invalid,{h,k},a,b,theta];$Failed) /;
(FreeQ[{h,k,a,b,theta},_Pattern] && IsZeroOrNegative2D[{a,b},Or,0]);
Hyperbola2D[{h_,k_},a_,b_,theta_] :=
Hyperbola2D[{h,k},a,b,PrimaryAngle2D[theta,Pi]] /;
(FreeQ[{h,k,a,b,theta},_Pattern] && (theta=!=PrimaryAngle2D[theta,Pi]));
IsValid2D[Hyperbola2D[{h_,k_},a_,b_,theta_,True]] :=
IsValid2D[Hyperbola2D[{h,k},a,b,theta]];
IsValid2D[Hyperbola2D[{h_,k_},a_,b_,theta_,False]] :=
IsValid2D[Hyperbola2D[{h,k},a,b,theta]];
IsValid2D[
Hyperbola2D[{h_?IsScalar2D,k_?IsScalar2D},
a_?IsScalar2D,b_?IsScalar2D,
theta_?IsScalar2D]] := True;
448 D2DHyperbola2D - Transformations
Scalars
Angle of Rotation
Angle2D[hyperbola] Returns the rotation angle of a hyperbola.
Angle2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] := theta;
SemiTransverseAxis2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] := a;
SemiConjugateAxis2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] := b;
Transformations
Reflect
Reflect2D[hyperbola, line] Reflects a hyperbola in a line.
Reflect2D[Hyperbola2D[{h_,k_},a_,b_,theta_],L:Line2D[p_,q_,r_]] :=
Hyperbola2D[Reflect2D[{h,k},L],a,b,ReflectAngle2D[theta,L]];
Rotate
Rotate2D[hyperbola, θ, coords] Rotates a hyperbola by an angle θ about a position
specified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Hyperbola2D[{h_,k_},a_,b_,theta_],alpha_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Hyperbola2D[Rotate2D[{h,k},alpha,{x0,y0}],a,b,alpha+theta];
D2DHyperbola2D - Point Construction 449
Scale
Scale2D[hyperbola, s, coords] Scales a hyperbola from a position given by coordinates. If
the third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Hyperbola2D[{h_,k_},a_,b_,theta_],s_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Hyperbola2D[Scale2D[{h,k},s,{x0,y0}],s*a,s*b,theta] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[hyperbola, {u, v}] Translates a hyperbola delta distance.
Translate2D[Hyperbola2D[{h_,k_},a_,b_,theta_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Hyperbola2D[{h+u,k+v},a,b,theta];
Point Construction
Center Point of a Hyperbola
Point2D[hyperbola] Constructs the center point of a hyperbola.
Point2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] := Point2D[{h,k}];
Pole Point
Point2D[line, hyperbola] Constructs the pole (point) of a polar (line) with respect to a
hyperbola. If the line is tangent to the hyperbola then the point is the point of tangency.
Point2D[L1:Line2D[a1_,b1_,c1_],H2:Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Point2D[L1,Quadratic2D[H2]];
Line Construction
Axis of a Hyperbola
Line2D[hyperbola] Constructs a line that contains the transverse axis of a hyperbola.
Line2D[Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Rotate2D[Line2D[0,1,-k],theta,{h,k}];
450 D2DHyperbola2D - Hyperbola Construction
Polar Line
Line2D[point, hyperbola] Constructs the polar (line) of a pole (point) with respect to a
hyperbola. If the point is on the hyperbola then the line is tangent to the hyperbola at the
point.
Line2D[P1:Point2D[{x1_,y1_}],H2:Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Line2D[P1,Quadratic2D[H2]];
Hyperbola Construction
Conjugate Hyperbola
Hyperbola2D[hyperbola, Conjugate2D] Constructs the conjugate hyperbola of a given
hyperbola.
Hyperbola2D[Hyperbola2D[{h_,k_},a_,b_,theta_],Conjugate2D] :=
Hyperbola2D[{h,k},b,a,theta+Pi/2]
Hyperbola2D::invdef=
"The defining geometry or eccentricity is invalid; the eccentricity of a
hyperbola must be greater than 1, the foci and vertices cannot be
coincident and the focus cannot lie on the directrix.";
Hyperbola2D[{P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}]},e_?IsScalar2D] :=
Module[{a,b,h,k},
If[IsZeroOrNegative2D[e-1] || IsCoincident2D[P1,P2],
Message[Hyperbola2D::invdef];$Failed,
a=Distance2D[P1,P2]/2;
b=a*Sqrt[e^2-1];
{h,k}={(x1+x2)/2,(y1+y2)/2};
Hyperbola2D[{h,k},a,b,ArcTan[x2-x1,y2-y1]]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DHyperbola2D‘" *)
D2DIntersect2D
The package D2DIntersect2D constructs points that are the intersection points of two curves.
It also computes the parameter values where a chordal line intersects a conic curve.
Initialization
BeginPackage["D2DIntersect2D‘",{"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DEquations2D‘", "D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DHyperbola2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘",
"D2DParabola2D‘", "D2DPoint2D‘", "D2DQuadratic2D‘", "D2DSolve2D‘",
"D2DTransform2D‘"}];
D2DIntersect2D::usage=
"D2DIntersect2D is a package for constructing the intersection points
between curves.";
Parameters2D::usage=
"Parameters2D[line, conic] constructs a list containing the two
parameters where a line intersects a conic (circle, ellipse, parabola or
hyperbola).";
Points2D::usage=
"Points2D[curve ,curve] constructs a list of intersection points of two
curves.";
Begin["‘Private‘"];
Intersection Points
Intersection Point of Two Lines
Points2D[line, line] Constructs a list containing up to one point that is the intersection
point of two lines.
Points2D[L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_]] :=
If[IsParallel2D[L1,L2], {}, {Point2D[L1,L2]}];
453
454 D2DIntersect2D - Intersection Points
Points2D[Line2D[a1_,b1_,c1_],Circle2D[{h2_,k2_},r2_]] :=
Module[{a,b,d,z,mapList},
{a,b,d}={a1,b1,a1*h2+b1*k2+c1}/Sqrt[a1^2+b1^2];
z=r2^2-d^2;
mapList=Which[IsZero2D[z], {0},
IsNegative2D[z], {},
True, {-1,1}];
Map[Point2D[{h2-a*d+#*b*Sqrt[z],k2-b*d-#*a*Sqrt[z]}]&,mapList] ];
Points2D[Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_]] :=
Module[{s,d,R,x0,y0,cos,sin,z,mapList},
If[IsCoincident2D[{h1,k1},{h2,k2}],{},
s=(h1-h2)^2+(k1-k2)^2; d=Sqrt[s]; R=s+r1^2-r2^2;
{x0,y0}={R,Sqrt[z=(4*s*r1^2-R^2)]}/(2d);
{cos,sin}={h2-h1,k2-k1}/d;
mapList=Which[IsZero2D[z], {0},
IsNegative2D[z], {},
True, {-1,1}];
Map[Point2D[{h1+cos*x0+#*sin*y0,k1+sin*x0-#*cos*y0}]&,mapList]] ];
Eqn$2D[crv_] :=
If[Is2D[crv,{Line2D,Quadratic2D}],crv,Quadratic2D[crv]];
Points2D[crv1_,crv2_] :=
Module[{x,y,eqns,roots},
eqns=Map[Equation2D[#,{x,y}]&,Map[Eqn$2D,{crv1,crv2}]];
roots=Select[Solve2D[eqns,{x,y}],Not[IsComplex2D[{x,y} /. #]]&];
Union[Map[(Point2D[{x,y}] /. #)&,roots]] ] /;
(Is2D[crv1,
{Circle2D,Ellipse2D,Hyperbola2D,Line2D,Parabola2D,Quadratic2D}] &&
Is2D[crv2,
{Circle2D,Ellipse2D,Hyperbola2D,Line2D,Parabola2D,Quadratic2D}]);
D2DIntersect2D - Chordal Parameter Range 455
Circle
Parameters2D[line, circle] Constructs a list containing the two parameters on a cir-
cle where a line intersects the circle. The parameters will be primary angles and sorted in
increasing order (0 ≤ θ1 < θ2 < 2π).
Parameters2D::noChord=
"No chord exists between ‘1‘ and ‘2‘.";
Parameters2D[L1:Line2D[a1_,b1_,c1_],C2:Circle2D[{h2_,k2_},r2_]] :=
Module[{pts,x1,x2,y1,y2},
pts=Points2D[L1,C2];
If[Length[pts]==2,
{{x1,y1},{x2,y2}}=Map[Coordinates2D,pts];
SortNumeric$2D[{PrimaryAngle2D[ArcTan[x1-h2,y1-k2]],
PrimaryAngle2D[ArcTan[x2-h2,y2-k2]]}],
Message[Parameters2D::noChord,L1,C2];$Failed] ];
Ellipse
Parameters2D[line, ellipse] Returns a list of the two parameters on an ellipse where a line
intersects the ellipse. The parameters will be primary angles and sorted in increasing order
(0 ≤ θ1 < θ2 < 2π).
Parameters2D[L1:Line2D[a1_,b1_,c1_],E2:Ellipse2D[{h_,k_},a_,b_,theta_]] :=
Module[{ln,pts,x1,y1,x2,y2},
ln=Rotate2D[Translate2D[L1,{-h,-k}],-theta];
pts=Points2D[ln,Ellipse2D[{0,0},a,b,0]];
If[Length[pts]==2,
{{x1,y1},{x2,y2}}=Map[Coordinates2D,pts];
SortNumeric$2D[{PrimaryAngle2D[ArcTan[x1/a,y1/b]],
PrimaryAngle2D[ArcTan[x2/a,y2/b]]}],
Message[Parameters2D::noChord,L1,E2];$Failed] ];
Hyperbola
Parameters2D[line, hyperbola] Returns a list of the two parameters on a hyperbola where
a line intersects the hyperbola. The parameters are sorted in the order (−∞ < t1 < t2 < +∞).
456 D2DIntersect2D - Epilogue
The line must intersect the hyperbola’s primary branch (in standard position) in two points
for a parameter range to be returned.
Parameters2D[L1:Line2D[a1_,b1_,c1_],
H2:Hyperbola2D[{h_,k_},a_,b_,theta_]] :=
Module[{ln,pts,t1,t2,x1,x2,y1,y2},
ln=Rotate2D[Translate2D[L1,{-h,-k}],-theta];
pts=Points2D[ln,Hyperbola2D[{0,0},a,b,0]];
If[Length[pts]==2,
{{x1,y1},{x2,y2}}=Map[Coordinates2D,pts];
t1=ArcSinh[y1/b]/ArcCosh[Sqrt[a^2+b^2]/a];
t2=ArcSinh[y2/b]/ArcCosh[Sqrt[a^2+b^2]/a];
If[IsZero2D[t1-t2],
Message[Parameters2D::noChord,L1,H2];$Failed,
If[IsNumeric2D[{t1,t2}] &&
Not[IsCoincident2D[L1,Line2D[H2[t1],H2[t2]]]],
Message[Parameters2D::noChord,L1,h2];$Failed,
SortNumeric$2D[{t1,t2}]] ],
Message[Parameters2D::noChord,L1,H2];$Failed] ];
Parabola
Parameters2D[line, parabola] Returns a list of two parameters on a parabola where a line
intersects the parabola. The parameters are sorted in increasing order (∞ < t1 < t2 < +∞).
Parameters2D[L1:Line2D[a1_,b1_,c1_],P2:Parabola2D[{h_,k_},f_,theta_]] :=
Module[{t,x,y,ans},
{x,y}=P2[t];
ans=Select[Solve[a1*x+b1*y+c1==0,t],Not[IsComplex2D[t /. #]]&];
If[Length[ans]==2,
SortNumeric$2D[Map[(t /. #)&,ans]],
Message[Parameters2D::noChord,L1,P2];$Failed] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DIntersect2D‘" *)
D2DLine2D
Initialization
BeginPackage["D2DLine2D‘", {"D2DEquations2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DLine2D::usage=
"D2DLine2D is a package that implements the Line2D object.";
Angle2D::usage=
"Angle2D[line] gives the between the +x-axis and a line;
Angle2D[line,line] gives the angle measured counter-clockwise from the
first line to the second line. Angle2D[conic] gives the angle of rotation
of a conic.";
Line2D::usage=
"Line2D[A,B,C] is the standard form of a line with the equation
Ax+By+C=0.";
Parallel2D::usage=
"Parallel2D is the keyword required in Line2D[point, line, Parallel2D].";
Perpendicular2D::usage=
"Perpendicular2D is the keyword required in Line2D[point, point,
Perpendicular2D]; it is also required in Line2D[point, line,
Perpendicular2D].";
Slope2D::usage=
"Slope2D[line] gives the slope of a line. Slope[lnseg] gives the slope
of a line segment.";
Begin["‘Private‘"];
457
458 D2DLine2D - Description
Description
Representation
Line2D[A, B, C] Standard representation of a line in Descarta2D. The three arguments
are the coefficients of the line in general form, Ax + By + C = 0. The normal form of a line,
x cos θ + y sin θ − ρ = 0, is also by provided by using the form Line2D[cos θ, sin θ, −ρ], where
θ is the angle the normal to the line makes with the +x-axis, and ρ is the distance of the line
from the origin.
Equations
Line2D[expr, {x, y}] Constructs a line from a linear polynomial in two unknowns. For
example, the polynomial ax+by +c will return Line2D[a, b, c]; the equation ax+by +c == 0
will also return Line2D[a, b, c]. The {x, y} arguments are assumed to be the names of the
variables.
Line2D::noPoly=
"The expression ‘1‘ cannot be recognized as a linear polynomial or
equation in variables ‘2‘ and ‘3‘.";
Line2D[expr_,{x_,y_}] :=
Module[{poly,a,b,c},
poly=If[Head[expr]===Equal,
expr[[1]]-expr[[2]],
expr] //Expand;
a=Coefficient[poly,x];
b=Coefficient[poly,y];
c=(poly /. {x->0,y->0}) //Expand;
If[IsZero2D[a*x+b*y+c-poly],
Line2D[a,b,c],
Message[Line2D::noPoly,expr,x,y];$Failed] ];
Evaluation
Line2D[A, B, C][t] Evaluates a parameter, t, on a line. Returns a coordinate list {x, y}.
The point nearest the origin is at parameter t = 0. Other points are parameterized by distance
along the line.
Line2D[a1_,b1_,c1_][t_?IsScalar2D] :=
Module[{a,b,c},
{a,b,c}={a1,b1,c1}/Sqrt[a1^2+b1^2];
-{a*c,b*c}+{b,-a}*t ];
Graphics
Provides graphics for a line by extending the Mathematica Display command. Executed
when the package is loaded.
D2DLine2D - Description 459
SetDisplay2D[
Line2D[a_,b_,c_][{t1_?IsScalar2D,t2_?IsScalar2D}],
Line[{Line2D[a,b,c][t1],
Line2D[a,b,c][t2]}] ];
SetDisplay2D[
Line2D[a_,b_,c_],
Line[{Line2D[a,b,c][-AskCurveLength2D[ ]/2],
Line2D[a,b,c][ AskCurveLength2D[ ]/2]}] ];
Validation
Line2D[A, B, C] Detects a line with imaginary coefficients and returns the $Failed
symbol. If the imaginary parts are insignificant, they are removed.
Line2D::imaginary=
"An invalid line of the form ’Line2D[‘1‘, ‘2‘, ‘3‘]’ has been detected;
the arguments cannot be imaginary.";
Line2D[a_,b_,c_] :=
(Line2D @@ ChopImaginary2D[Line$2D[a,b,c]]) /;
(FreeQ[{a,b,c},_Pattern] && IsTinyImaginary2D[{a,b,c}]);
Line2D[a_,b_,c_] :=
(Message[Line2D::imaginary,a,b,c];$Failed) /;
(FreeQ[{a,b,c},_Pattern] && IsComplex2D[{a,b,c},0]);
Line2D[A, B, C] Returns the $Failed symbol when an invalid line is detected (the first
two coefficients are zero). Also, normalizes lines with tiny coefficients to improve numerical
stability.
Line2D::invalid=
"An invalid line of the form ’Line2D[‘1‘, ‘2‘, ‘3‘]’ was encountered; at
least one of the first two coefficients must be non-zero.";
Line2D[a_,b_,c_] :=
(Message[Line2D::invalid,a,b,c];$Failed) /;
(FreeQ[{a,b,c},_Pattern] && IsZero2D[{a,b},And,0]);
Line2D[a_,b_,c_] :=
(Line2D @@ ({a,b,c}/Sqrt[a^2+b^2])) /;
(FreeQ[{a,b,c},_Pattern] && IsZero2D[{a,b},And]);
IsValid2D[Line2D[a_?IsScalar2D,b_?IsScalar2D,c_?IsScalar2D]] := True;
460 D2DLine2D - Scalars
protected=Unprotect[FullSimplify];
FullSimplify[expr_?(!FreeQ[#,Line2D[a_,b_,c_]]&),
opts___] :=
FullSimplify[expr /. Line2D[a_,b_,c_] :>
(Line$2D @@ SimplifyCoefficients2D[{a,b,c}]),
opts] /. Line$2D->Line2D;
Protect[Evaluate[protected]];
Scalars
Angle of a Line
Angle2D[line] Computes the angle measured counter-clockwise from the +x-axis to a line.
The result is returned in radians.
Angle2D[Line2D[a_,b_,c_]] :=
PrimaryAngle2D[If[IsZero2D[b],Pi/2,ArcTan[-a/b]],Pi];
Slope of a Line
Slope2D[line] Computes the slope of a line.
Slope2D[Line2D[a_,b_,c_]] := If[IsZero2D[b],Infinity,-a/b];
D2DLine2D - Transformations 461
Transformations
Reflect
Reflect2D[line, line] Reflects the first line in the second line.
Reflect2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_]] :=
Module[{a,b,c},
a=a1*(b2^2-a2^2)-2*b1*a2*b2;
b=b1*(a2^2-b2^2)-2*a1*a2*b2;
c=c1*(a2^2+b2^2)-2*c2*(a1*a2+b1*b2);
Line2D[a,b,c] ];
Rotate
Rotate2D[line, θ, coords] Rotates a line by an angle θ about a position given by coordi-
nates. If the third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Rotate2D[Line2D[a_,b_,c_],theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Line2D[a*Cos[theta]-b*Sin[theta],
b*Cos[theta]+a*Sin[theta],
a*h+b*k+c-Cos[theta]*(a*h+b*k)-Sin[theta]*(a*k-b*h)];
Scale
Scale2D[line, s, coords] Scales a line from a position given by coordinates. If the third
argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Line2D[a_,b_,c_],s_?IsScalar2D,{h_?IsScalar2D,k_?IsScalar2D}] :=
Line2D[a,b,a*(s-1)*h+b*(s-1)*k+c*s] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[line, {u, v}] Translates a line delta distance.
Translate2D[Line2D[a_,b_,c_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Line2D[a,b,-a*u-b*v+c];
Line Construction
Normalize a Line
Line2D[line] Constructs a line with normalized coefficients.
462 D2DLine2D - Line Construction
Line2D[Line2D[a_,b_,c_]] :=
If[IsZeroOrNegative2D[c],
Apply[Line2D, {a,b,c}/Sqrt[a^2+b^2]],
Apply[Line2D,-{a,b,c}/Sqrt[a^2+b^2]] ];
Line2D[Point2D[{x0_,y0_}],Infinity] := Line2D[1,0,-x0];
Line2D[Point2D[{x0_,y0_}],m_?IsScalar2D] := Line2D[m,-1,-m*x0+y0];
Offset Line
Line2D[line, d] Constructs a line offset a given distance from a given line. The offset
distance may be positive or negative to produce the two possible offset lines.
Line2D[Line2D[a_,b_,c_],d_?IsScalar2D] :=
Line2D[a,b,c-d*Sqrt[a^2+b^2]];
Line2D::sameCoords=
"The coordinates ‘1‘ and ‘2‘ are coincident; no valid line can be
constructed.";
Line2D[{x1_?IsScalar2D,y1_?IsScalar2D},{x2_?IsScalar2D,y2_?IsScalar2D}] :=
If[IsCoincident2D[{x1,y1},{x2,y2}],
Message[Line2D::sameCoords,{x1,y1},{x2,y2}];$Failed,
Line2D[-(y2-y1),(x2-x1),(x1*y2-x2*y1)] ];
Line2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}]] := Line2D[{x1,y1},{x2,y2}];
D2DLine2D - Epilogue 463
Line2D[Point2D[{x1_,y1_}],Line2D[a2_,b2_,c2_],Perpendicular2D] :=
Line2D[b2,-a2,-x1*b2+y1*a2];
Line2D[P1:Point2D[{x1_,y1_}],Q2:Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Module[{p,q,r},
p=2*a*x1+b*y1+d; q=b*x1+2*c*y1+e; r=d*x1+e*y1+2*f;
If[IsZero2D[{p,q},And],
Message[Line2D::noPolar,P1,Q2];$Failed,
Line2D[p,q,r]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DLine2D‘" *)
D2DLoci2D
The package D2DLoci2D provides functions for constructing loci (points, lines and conics) from
equations.
Initialization
BeginPackage["D2DLoci2D‘",{"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DExpressions2D‘", "D2DGeometry2D‘", "D2DHyperbola2D‘", "D2DLine2D‘",
"D2DParabola2D‘", "D2DPoint2D‘", "D2DQuadratic2D‘", "D2DTransform2D‘"}];
D2DLoci2D::usage=
"D2DLoci2D is a package that provides functions constructing loci
(points, lines and conics) from equations.";
Loci2D::usage=
"Loci2D[quad] constructs a list of loci (point, lines or conics)
represented by a quadratic; Loci2D[point, line, eccentricity] constructs a
list of loci (point, lines or conics) given the focus point, directrix line
and eccentricity.";
Begin["‘Private‘"];
Utilities
Not Zero Query
The private function NotZero$2D returns the logical negation of IsZero2D.
NotZero$2D[r_] := Not[IsZero2D[r]];
Conic Construction
Conic from Quadratic
Loci2D[quad] Constructs a list of conics (proper or degenerate) represented by a quadratic.
465
466 D2DLoci2D - Conic Construction
Loci2D::central=
"The quadratic is a central conic, but its type cannot be determined.";
Loci2D::noLocus=
"The quadratic has no real locus.";
π 3π
Parabola, Ay 2 + Dx + Ey + F = 0: Constructs a list of one parabola rotated 2 or 2
radians.
Loci2D[Quadratic2D[a_?NotZero$2D,b_?IsZero2D,c_?IsZero2D,
d_,e_?NotZero$2D,f_]] :=
Module[{h,k,p},
h=-d/(2*a);
k=(d^2-4*a*f)/(4*a*e);
p=-e/(4*a);
If[IsNegative2D[p],
{Parabola2D[{h,k},-p,3Pi/2]},
{Parabola2D[{h,k}, p, Pi/2]}] ];
Loci2D[P1:Point2D[{x1_,y1_}],L2:Line2D[a2_,b2_,c2_],e_?IsScalar2D] :=
If[IsZeroOrNegative2D[e],
Message[Loci2D::eccentricity,e];$Failed,
Loci2D[Quadratic2D[P1,L2,e]] ];
Loci2D[P1:Point2D[{x1_,y1_}],fcLen_?IsScalar2D,e_?IsScalar2D,
theta_?IsScalar2D] :=
Module[{Q},
Q=Quadratic2D[P1,fcLen,e,theta];
If[Q===$Failed,Q,Loci2D[Q]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DLoci2D‘" *)
D2DMaster2D
The package D2DMaster2D is the master package for Descarta2D. It establishes the names
owned by all the other Descarta2D packages (so they will load automatically when referenced),
and it provides the basic environment of queries supporting the Descarta2D objects.
Descarta2D Initialization
Load the Descarta2D package stubs.
If[Names["D2DMaster2D"]=={"D2DMaster2D"},
D2DMaster$2D::loaded=
"The package ’D2DMaster2D’ has already been loaded.";
Message[D2DMaster$2D::loaded]];
D2DMaster$2D::noPath=
"The path to ’D2DMaster2D.m’ cannot be found; unable to initialize
Descarta2D.";
D2DMaster$2D::tooManyPaths=
"More than one path to ’D2DMaster2D.m’ was found; using ‘1‘.";
D2D$paths=Map[(#<>"\\Descarta2D")&,$Path];
D2D$dir=Select[D2D$paths,
(Length[FileNames["D2DMaster2D.m",{#}]]>0)&];
If[Length[D2D$dir]===0,
Message[D2DMaster$2D::noPath],
If[Length[D2D$dir]>1,
Message[D2DMaster$2D::tooManyPaths,First[D2D$dir]]];
If[!MemberQ[$Path,First[D2D$dir]],AppendTo[$Path,First[D2D$dir]]]];
Remove[D2D$paths,D2D$dir];
469
470 D2DMaster2D - Descarta2D Initialization
DeclarePackage["D2DTangentCircles2D‘", {"D2DTangentCircles2D",
"TangentCircles2D"}];
DeclarePackage["D2DTangentConics2D‘", {"D2DTangentConics2D",
"TangentConics2D", "TangentQuadratics2D"}];
DeclarePackage["D2DTangentLines2D‘", {"D2DTangentLines2D",
"TangentEquation2D", "TangentLines2D", "TangentSegments2D"}];
DeclarePackage["D2DTangentPoints2D‘", {"D2DTangentPoints2D",
"TangentPoints2D"}];
Package Initialization
BeginPackage["D2DMaster2D‘"];
D2DMaster2D::usage=
"D2DMaster2D is the master package for Descarta2D.";
D2DMaster2D::loaded=
"The package ’D2DMaster2D’ has already been loaded.";
Is2D::usage=
"Is2D[object,headList] returns ’True’ if the object is valid and its
head is included in the list of object heads.";
IsValid2D::usage=
"IsValid2D[object] returns ’True’ if the object is syntactically valid.";
ObjectNames2D::usage=
"ObjectNames2D[ ] returns a list of strings that are the names of all
Descarta2D objects.";
Begin["‘Private‘"];
472 D2DMaster2D - Epilogue
Objects
Object Names
ObjectNames2D[ ] Returns a list of strings that are the symbolic names for all Descarta2D
objects.
Default Queries
Is Query
Is2D[object, objHeadList] Returns True if an object is valid and has its head included in
the objHeadList; otherwise, returns False.
Is2D[obj_,objHead_List] :=
(IsValid2D[obj] && (Or @@ Map[(Head[obj]===#)&,objHead]));
Valid Query
IsValid2D[object] Returns True if the object is geometric and is syntactically valid;
otherwise, returns False. Only the default case is implemented here.
IsValid2D[___] := False;
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DMaster2D‘" *)
D2DMedial2D
The package D2DMedial2D constructs curves that are equidistant from two points, lines or
circles.
Initialization
BeginPackage["D2DMedial2D‘",{"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DMaster2D‘", "D2DLine2D‘", "D2DLoci2D‘",
"D2DPoint2D‘", "D2DQuadratic2D‘"}];
D2DMedial2D::usage=
"D2DMedial2D is a package that constructs medial equations and loci.";
MedialEquations2D::usage=
"MedialEquations2D[{obj,obj}] constructs a list of lines or quadratics
equidistant from two objects (points, lines or circles).";
MedialLoci2D::usage=
"MedialLoci2D[{obj,obj}] constructs a list of curves equidistant from
two objects (points, lines or circles).";
Begin["‘Private‘"];
MedialEquations2D::coincident=
"The objects {‘1‘, ‘2‘} are coincident; no finite number of medial
equations exist.";
Medial Equations
Medial Linear or Quadratic
MedialEquations2D[{obj1, obj2 }] Constructs a list of lines or quadratics equidistant from
two objects (points, lines or circles).
MedialEquations2D[{obj1_,obj2_}] :=
If[TrueQ[IsCoincident2D[obj1,obj2]],
Message[MedialEquations2D::coincident,obj1,obj2];{},
Medial$2D[Reverse[Sort[{obj1,obj2}]]]] /;
Is2D[obj1,{Point2D,Line2D,Circle2D}] &&
Is2D[obj2,{Point2D,Line2D,Circle2D}];
473
474 D2DMedial2D - Medial Loci
Medial Loci
Medial Loci
MedialLoci2D[{obj1, obj2 }] Constructs a list of curves equidistant from two objects
(points, lines or circles).
MedialLoci2D[{obj1_,obj2_}] :=
Union[
Flatten[
Map[If[Head[#]===Line2D,#,Loci2D[#]]&,
MedialEquations2D[{obj1,obj2}]]]] /;
Is2D[obj1,{Point2D,Line2D,Circle2D}] &&
Is2D[obj2,{Point2D,Line2D,Circle2D}];
Point–Point
The private function Medial$2D constructs a list of one line equidistant from two points.
Medial$2D[{Point2D[{x1_,y1_}],Point2D[{x2_,y2_}]}] :=
{Line2D[2*(x2-x1),2*(y2-y1),(x1^2+y1^2)-(x2^2+y2^2)]};
Point–Line
The private function Medial$2D constructs a list of one quadratic representing the curve
equidistant from a point and a line.
Medial$2D[{Point2D[{x1_,y1_}],Line2D[a2_,b2_,c2_]}] :=
Module[{a,b,c,d,e,f,p,q,r},
{p,q,r}={a2,b2,c2}/Sqrt[a2^2+b2^2];
a=q^2;
b=-2*p*q;
c=p^2;
d=-2*(x1+p*r);
e=-2*(y1+q*r);
f=x1^2+y1^2-r^2;
{Quadratic2D[a,b,c,d,e,f]} ];
Point–Circle
The private function Medial$2D constructs a list of one quadratic representing the curve
equidistant from a point and a circle.
D2DMedial2D - Medial Loci 475
Medial$2D[{Point2D[{x1_,y1_}],Circle2D[{h2_,k2_},r2_]}] :=
Module[{R,a,b,c,d,e,f},
R=(h2^2+k2^2)-(x1^2+y1^2)-r2^2;
a=4((x1-h2)^2-r2^2);
b=8*(x1-h2)*(y1-k2);
c=4((y1-k2)^2-r2^2);
d=4*(R*(x1-h2)+2*r2^2*x1);
e=4*(R*(y1-k2)+2*r2^2*y1);
f=R^2-4*r2^2*(x1^2+y1^2);
{Quadratic2D[a,b,c,d,e,f]} ];
Line–Line
The private function Medial$2D constructs a list of two lines equidistant from two lines (the
angle bisectors). If the lines are parallel, only one line is returned in the list.
Medial$2D[{L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_]}] :=
Module[{a,b,c,f1,f2,s},
f1=Sqrt[a1^2+b1^2];
f2=Sqrt[a2^2+b2^2];
a=a1*f2+s*a2*f1;
b=b1*f2+s*b2*f1;
c=c1*f2+s*c2*f1;
If[IsParallel2D[L1,L2],
If[IsZero2D[Sqrt[a^2+b^2] /. s->1],
{Line2D[a,b,c]} /. s->-1,
{Line2D[a,b,c]} /. s->1],
Map[(Line2D[a,b,c] /. s->#)&,{-1,1}]] ];
Line–Circle
The private function Medial$2D constructs a list of two quadratics representing curves equidis-
tant from a line and a circle.
Medial$2D[{Line2D[a1_,b1_,c1_],Circle2D[{h2_,k2_},r2_]}] :=
Module[{a,b,c,d,e,f,p,q,r,s},
{p,q,r}={a1,b1,c1}/Sqrt[a1^2+b1^2];
a=q^2;
b=-2*p*q;
c=p^2;
d=-2*(h2+p*(r+s*r2));
e=-2*(k2+q*(r+s*r2));
f=(h2^2+k2^2)-r2^2-r*(r+2*s*r2);
Map[(Quadratic2D[a,b,c,d,e,f] /. s->#)&, {-1,1}] ];
Circle–Circle
The private function Medial$2D constructs a list of two quadratics representing the curves
equidistant from two circles.
476 D2DMedial2D - Epilogue
Medial$2D[{Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_]}] :=
Module[{s,R,D1,D2,a,b,c,d,e,f},
R=(r1-s*r2)^2;
D1=h1^2+k1^2;
D2=h2^2+k2^2;
a=4*((h1-h2)^2-R);
b=8*(h1-h2)*(k1-k2);
c=4*((k1-k2)^2-R);
d=4*(h1*(-D1+D2+R)+h2*(D1-D2+R));
e=4*(k1*(-D1+D2+R)+k2*(D1-D2+R));
f=(D1-D2)^2-2*(D1+D2)*R+R^2;
Map[(Quadratic2D[a,b,c,d,e,f] /. s->#)&, {-1,1}] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DMedial2D‘" *)
D2DNumbers2D
The package D2DNumbers2D provides functions for special manipulations of real numbers.
Initialization
BeginPackage["D2DNumbers2D‘", {"D2DExpressions2D‘", "D2DMaster2D‘"}];
D2DNumbers2D::usage=
"D2DNumbers2D is a package that provides utilities for manipulating
special numbers.";
ChopImaginary2D::usage=
"ChopImaginary2D[expr,(tol)] removes tiny imaginary parts from complex
numbers; the default tolerance, if omitted, is 10^(-10).";
PrimaryAngle2D::usage=
"PrimaryAngle2D[theta,period] normalizes an angle to a period; the
period must be Pi or 2Pi radians; if the period is omitted, it defaults to
2Pi.";
PrimaryAngleRange2D::usage=
"PrimaryAngleRange2D[{t1,t2}] normalizes a range of angles to primary
angles.";
Begin["‘Private‘"];
ChopImaginary2D[expr_,tol_:(10^(-10))] :=
MapAll[If[IsTinyImaginary2D[#],Re[#],#]&,expr] /;
TrueQ[N[tol]>=0];
477
478 D2DNumbers2D - Epilogue
Primary Angle
PrimaryAngle2D[θ, 2Pi | Pi] Adjusts an angle to a primary angle in the range 0 ≤ θ < p.
The period, p, may be Pi or 2Pi radians. The default period, if omitted, is 2Pi radians.
PrimaryAngle2D[theta_?IsScalar2D,period_:2Pi] :=
Module[{theta1=theta},
While[IsNegative2D[theta1],
theta1+=period];
While[IsZeroOrNegative2D[period-theta1],
theta1-=period];
If[Head[theta]===Real,N[theta1],theta1] ] /;
(period==Pi || period==2Pi);
PrimaryAngleRange2D[{t1_?IsScalar2D,t2_?IsScalar2D}] :=
Module[{T1,T2,twoPi},
T1=PrimaryAngle2D[t1];
T2=PrimaryAngle2D[t2];
twoPi=If[Head[T2]===Real,N[2Pi],2Pi];
If[IsZeroOrNegative2D[T2-T1],
{T1,T2+twoPi},
{T1,T2}] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DNumbers2D‘" *)
D2DParabola2D
Initialization
BeginPackage["D2DParabola2D‘",{"D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DQuadratic2D‘", "D2DSegment2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DParabola2D::usage=
"D2DParabola2D is a package that implements the Parabola2D object.";
FocalLength2D::usage=
"FocalLength2D[parabola] returns the focal length of a parabola.";
Parabola2D::usage=
"Parabola2D[{h,k},f,theta] is the standard form of a parabola that opens
to the right (when theta=0); {x,y} is the vertex point of the parabola; ’f’
is the distance from the vertex point to the focus; ’theta’ is the
counter-clockwise rotation (in radians) of the parabola about the vertex
point.";
Begin["‘Private‘"];
Description
Representation
Parabola2D[{h, k}, f, θ] Standard representation of a parabola in Descarta2D. The first
argument is a list of coordinates representing the position of the vertex of the parabola. The
second argument is a (positive) scalar representing the distance from the vertex to the focus
(the focal length). The third argument is the counter-clockwise rotation (in radians) of the
parabola about the vertex point.
479
480 D2DParabola2D - Description
Equation
Quadratic2D[parabola] Constructs the quadratic representing the equation of a parabola.
Quadratic2D[Parabola2D[{h_,k_},f_,theta_]] :=
Rotate2D[Quadratic2D[0,0,1,-4*f,-2*k,k^2+4*h*f],theta,{h,k}];
Evaluation
Parabola2D[{h, k}, f, θ][t] Evaluates a parabola at a parameter t (−∞ < t < +∞).
The end points of the latus rectum are at t = −1 and t = 1.
Parabola2D[{h_,k_},f_,theta_][t_?IsScalar2D] :=
Rotate2D[{h+f*t^2,k+2*f*t},theta,{h,k}];
Graphics
Provides graphics for a parabola by extending the Mathematica Display command. Executed
when the package is loaded.
SetDisplay2D[
Parabola2D[{h_,k_},f_,t_][{t1_?IsScalar2D,t2_?IsScalar2D}],
MakePrimitives2D[Parabola2D[{h,k},f,t],{t1,t2}] ];
SetDisplay2D[
Parabola2D[{h_,k_},f_,t_],
MakePrimitives2D[Parabola2D[{h,k},f,t],
CurveLimits2D[{0,0},
Parabola2D[{0,0},f,0]]] ];
Validation
Parabola2D[{h, k}, f, θ] Detects a parabola with imaginary arguments and returns the
$Failed symbol. If the imaginary parts are insignificant, they are removed.
Parabola2D::imaginary=
"An invalid parabola of the form ’Parabola2D[‘1‘, ‘2‘, ‘3‘]’ has been
detected; the arguments cannot be imaginary.";
Parabola2D[{h_,k_},f_,theta_] :=
(Parabola2D @@ ChopImaginary2D[Parabola$2D[{h,k},f,theta]]) /;
(FreeQ[{h,k,f,theta},_Pattern] && IsTinyImaginary2D[{h,k,f,theta}]);
Parabola2D[{h_,k_},f_,theta_] :=
(Message[Parabola2D::imaginary,{h,k},f,theta];$Failed) /;
(FreeQ[{h,k,f,theta},_Pattern] && IsComplex2D[{h,k,f,theta},0]);
Parabola2D[{h, k}, f, θ] Detects a parabola with an invalid focal length. If the focal
length is negative, the parabola is rotated π radians to make it positive; if the focal length is
zero, the $Failed symbol is returned.
D2DParabola2D - Scalars 481
Parabola2D::invalid=
"An invalid parabola of the form ’Parabola2D[‘1‘, ‘2‘, ‘3‘]’ has been
detected; the focal length cannot be zero.";
Parabola2D[{h_,k_},f_,theta_] :=
(Message[Parabola2D::invalid,{h,k},f,theta];$Failed) /;
(FreeQ[{h,k,f,theta},_Pattern] && IsZero2D[f,0]);
Parabola2D[{h_,k_},f_,theta_] :=
Parabola2D[{h,k},-f,theta+Pi] /;
(FreeQ[{h,k,f,theta},_Pattern] && IsNegative2D[f,0]);
Parabola2D[{h, k}, f, θ] Adjusts the rotation angle on a parabola to the range 0 ≤ θ < 2π.
Parabola2D[{h_,k_},f_,theta_] :=
Parabola2D[{h,k},f,PrimaryAngle2D[theta]] /;
(FreeQ[{h,k,f,theta},_Pattern] && (theta=!=PrimaryAngle2D[theta]));
IsValid2D[Parabola2D[{h_?IsScalar2D,k_?IsScalar2D},
f_?IsScalar2D,
theta_?IsScalar2D]] := True;
Scalars
Angle of Rotation
Angle2D[parabola] Returns the rotation angle of a parabola.
Angle2D[Parabola2D[{h_,k_},f_,theta_]] := theta;
Focal Length
FocalLength2D[parabola] Returns the focal length of a parabola.
FocalLength2D[Parabola2D[{h_,k_},f_,theta_]] := f;
Transformations
Reflect
Reflect2D[parabola, line] Reflects a parabola in a line.
Reflect2D[Parabola2D[{h_,k_},f_,theta_],L2:Line2D[a2_,b2_,c2_]] :=
Parabola2D[Reflect2D[{h,k},L2],f,ReflectAngle2D[theta,L2]];
482 D2DParabola2D - Point Construction
Rotate
Rotate2D[parabola, θ, coords] Rotates a parabola by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Parabola2D[{h_,k_},f_,theta_],alpha_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Parabola2D[Rotate2D[{h,k},alpha,{x0,y0}],f,theta+alpha];
Scale
Scale2D[parabola, s, coords] Scales a parabola from a position given by coordinates. If
the third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Parabola2D[{h_,k_},f_,theta_],s_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Parabola2D[Scale2D[{h,k},s,{x0,y0}],s*f,theta] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[parabola, {u, v}] Translates a parabola delta distance.
Translate2D[Parabola2D[{h_,k_},f_,theta_],{u_?IsScalar2D,v_?IsScalar2D}] :=
Parabola2D[{h+u,k+v},f,theta];
Point Construction
Vertex Point
Point2D[parabola] Returns the vertex point of a parabola.
Point2D[Parabola2D[{h_,k_},f_,theta_]] := Point2D[{h,k}];
Pole Point
Point2D[line, parabola] Constructs the pole (point) of a polar (line) with respect to a
parabola. If the line is tangent to the parabola then the point is the point of tangency.
Point2D[L1:Line2D[a1_,b1_,c1_],P2:Parabola2D[{h_,k_},f_,theta_]] :=
Point2D[L1,Quadratic2D[P2]];
D2DParabola2D - Line Construction 483
Line Construction
Axis Line
Line2D[parabola] Constructs a line that contains the axis of a parabola.
Line2D[Parabola2D[{h_,k_},f_,theta_]] :=
Rotate2D[Line2D[0,1,-k],theta,{h,k}];
Polar Line
Line2D[point, parabola] Constructs the polar (line) of a pole (point) with respect to a
parabola. If the point is on the parabola then the line is tangent to the parabola at the point.
Line2D[P1:Point2D[{x1_,y1_}],P2:Parabola2D[{h_,k_},f_,theta_]] :=
Line2D[P1,Quadratic2D[P2]];
Parabola Construction
Parabola from Focus/Directrix
Parabola2D[point, line] Constructs a parabola from a focus point and a directrix line.
Parabola2D::invptln=
"The focus ‘1‘ is on the directrix ‘2‘; no valid parabola can be
constructed.";
Parabola2D[P1:Point2D[{x1_,y1_}],L2:Line2D[a2_,b2_,c2_]] :=
Module[{pt},
If[IsOn2D[P1,L2],
Message[Parabola2D::invptln,P1,L2];$Failed,
pt=Point2D[P1,L2];
Parabola2D[Coordinates2D[Point2D[P1,pt]],
Distance2D[P1,pt]/2,
ArcTan[x1-XCoordinate2D[pt],
y1-YCoordinate2D[pt]]]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DParabola2D‘" *)
D2DPencil2D
The package D2DPencil2D implements functions for computing families of Descarta2D curves
(lines, circles and quadratics).
Initialization
BeginPackage["D2DPencil2D‘",{"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DLine2D‘", "D2DQuadratic2D‘", "D2DPoint2D‘"}];
D2DPencil2D::usage=
"D2DPencil2D is a package that construction pencil curves.";
Pencil2D::usage=
"Pencil2D is a keyword used to specify the formation of a pencil of
objects.";
Begin["‘Private‘"];
Line Pencils
Pencil of Lines Through a Point
Line2D[point, θ, Pencil2D] Constructs a line parameterized by the variable θ representing
the pencil of lines through a point. The variable θ is the angle of rotation of the line.
Line2D[Point2D[{x_,y_}],t_?IsScalar2D,Pencil2D] :=
Line2D[-Sin[t],Cos[t],x*Sin[t]-y*Cos[t]];
Line2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_],k_?IsScalar2D,Pencil2D] :=
Line2D[(1-k)*a1+k*a2,(1-k)*b1+k*b2,(1-k)*c1+k*c2];
485
486 D2DPencil2D - Quadratic Pencils
Circle Pencils
Pencil of Circles from Two Circles
Circle2D[circle, circle, k, Pencil2D] Constructs a circle parameterized by the variable k
representing the pencil of circles having common intersection points with two given circles.
Circle2D[Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_],
k_?IsScalar2D,Pencil2D] :=
Module[{H,K,R1,R2,R},
H=(1-k)*h1+k*h2;
K=(1-k)*k1+k*k2;
R1=h1^2+k1^2-r1^2;
R2=h2^2+k2^2-r2^2;
R=Sqrt[H^2+K^2-(1-k)*R1-k*R2];
Circle2D[{H,K},R] ];
Quadratic Pencils
Pencil of Quadratics from Two Quadratics
Quadratic2D[quad, quad, k, Pencil2D] Constructs a quadratic parameterized by the
variable k representing the pencil of quadratics through the intersection points of two given
quadratics.
Quadratic2D[Quadratic2D[a1_,b1_,c1_,d1_,e1_,f1_],
Quadratic2D[a2_,b2_,c2_,d2_,e2_,f2_],
k_?IsScalar2D,Pencil2D] :=
Quadratic2D[(1-k)*a1+k*a2,(1-k)*b1+k*b2,(1-k)*c1+k*c2,
(1-k)*d1+k*d2,(1-k)*e1+k*e2,(1-k)*f1+k*f2];
Quadratic2D[{L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_]},
{L3:Line2D[a3_,b3_,c3_],L4:Line2D[a4_,b4_,c4_]},
k_?IsScalar2D,Pencil2D] :=
Module[{Q1,Q2},
Q1=Quadratic2D[L1,L2];
Q2=Quadratic2D[L3,L4];
Quadratic2D[Q1,Q2,k,Pencil2D] ];
D2DPencil2D - Epilogue 487
Quadratic2D::coincident=
"Two or more of the points are coincident; no valid quadratic pencil
exists.";
Quadratic2D[P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}],
P3:Point2D[{x3_,y3_}],P4:Point2D[{x4_,y4_}],
k_?IsScalar2D,Pencil2D] :=
If[IsCoincident2D[{P1,P2,P3,P4}],
Message[Quadratic2D::coincident];$Failed,
Quadratic2D[{Line2D[P1,P2],Line2D[P3,P4]},
{Line2D[P1,P3],Line2D[P2,P4]},k,Pencil2D] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DPencil2D‘" *)
D2DPoint2D
Initialization
BeginPackage["D2DPoint2D‘", {"D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DQuadratic2D‘",
"D2DSketch2D‘", "D2DTransform2D‘"}];
D2DPoint2D::usage=
"D2DPoint2D is a package that implements the Point2D object.";
Coordinates2D::usage=
"Coordinates2D[a1,a2,...] gives the {x,y} coordinates of the point
returned by Point2D[a1,a2,...].";
Distance2D::usage=
"Distance2D[coords,coords] gives the distance between two positions
given by coordinates; Distance2D[point,pt | ln | cir] gives the distance
between a point and a point, line or circle.";
Point2D::usage=
"Point2D[{x,y}] is the standard form of a point at coordinates {x,y}.";
XCoordinate2D::usage=
"XCoordinate2D[point] gives the x-coordinate of a point;
XCoordinate2D[coords] gives the x-coordinate of a coordinate location.";
YCoordinate2D::usage=
"YCoordinate2D[point] gives the y-coordinate of a point;
YCoordinate[coords] gives the y-coordinate of a coordinate location.";
Begin["‘Private‘"];
Description
Representation
{x, y} Standard representation of a location specified by (x, y) in Descarta2D.
489
490 D2DPoint2D - Scalars
Graphics
Provides graphics for a point by extending the Mathematica Display command. Executed
when the package is loaded.
SetDisplay2D[
Point2D[{x_,y_}],
{AbsolutePointSize[4],Point[{x,y}]} ];
Validation
Point2D[{x, y}] Detects that a point has imaginary coordinates and returns the $Failed
symbol. If the imaginary parts are insignificant, they are removed.
Point2D::imaginary=
"An invalid point of the form ’Point2D[{‘1‘,‘2‘}]’ has been detected;
the coordinates of a point cannot be imaginary.";
Point2D[{x_,y_}] :=
(Point2D @@ ChopImaginary2D[Point$2D[{x,y}]]) /;
(FreeQ[{x,y},_Pattern] && IsTinyImaginary2D[{x,y}]);
Point2D[{x_,y_}] :=
(Message[Point2D::imaginary,x,y];$Failed) /;
(FreeQ[{x,y},_Pattern] && IsComplex2D[{x,y},0]);
IsValid2D[Point2D[{x_?IsScalar2D,y_?IsScalar2D}]] := True;
Scalars
Coordinates Function
Coordinates2D[args..] Returns the {x, y} coordinates of Point2D[args..].
Coordinates2D[a___]:=
Module[{pt},
If[pt===$Failed,pt,{XCoordinate2D[pt],YCoordinate2D[pt]}] /;
(pt=Point2D[a] /. Point2D[Point2D[x___]]->Point2D[x];
(Is2D[pt,{Point2D}] || pt===$Failed))];
D2DPoint2D - Equations 491
X-Coordinate (Abscissa)
XCoordinate2D[coords] Returns the x-coordinate.
XCoordinate2D[{x_?IsScalar2D,y_?IsScalar2D}] := x;
Y-Coordinate (Ordinate)
YCoordinate2D[coords] Returns the y-coordinate.
YCoordinate2D[{x_?IsScalar2D,y_?IsScalar2D}] := y;
Equations
Quadratic
Quadratic2D[point] Constructs the quadratic representing the equation of a point (a point
circle).
Quadratic2D[Point2D[{x_,y_}]] := Quadratic2D[1,0,1,-2*x,-2*y,x^2+y^2];
492 D2DPoint2D - Point Construction
Transformations
Reflect
Reflect2D[point, line] Reflects a point in a line.
Reflect2D[Point2D[{x_,y_}],L:Line2D[a_,b_,c_]] :=
Point2D[ Reflect2D[{x,y},L] ];
Rotate
Rotate2D[point, θ, coords] Rotates a point by an angle θ about a position specified by co-
ordinates. If the third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Rotate2D[Point2D[{x_,y_}],theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Point2D[ Rotate2D[{x,y},theta,{h,k}] ];
Scale
Scale2D[point, s, coords] Scales a point from a position given by coordinates. If the
argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Point2D[{x_,y_}],s_?IsScalar2D,
{x0_?IsScalar2D,y0_?IsScalar2D}] :=
Point2D[{x0,y0}+s*{x-x0,y-y0}] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[point, {u, v}] Translates a point delta distance.
Translate2D[Point2D[{x_,y_}],{u_?IsScalar2D,v_?IsScalar2D}] :=
Point2D[{x+u,y+v}];
Point Construction
Point from Coordinates
Point2D[coords] Constructs a point from the x- and y-coordinates.
Point2D[x_?IsScalar2D,y_?IsScalar2D] := Point2D[{x,y}];
D2DPoint2D - Point Construction 493
Point2D[P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}],d_?IsScalar2D] :=
Module[{d12=Sqrt[(x2-x1)^2+(y2-y1)^2]},
If[IsZero2D[d12],
Message[Point2D::noDir,P1,P2];$Failed,
Point2D[{x1,y1}+{d*(x2-x1),d*(y2-y1)}/d12]] ];
Point of Division
Point2D[point, point, r1 , r2 ] Constructs a point which divides a line segment determined
by two points into the ratio r1 /r2 .
Point2D::noRatio=
"The sum of the ratio numbers {‘1‘, ‘2‘} cannot be zero.";
Point2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}],
r1_?IsScalar2D,r2_?IsScalar2D] :=
If[IsZero2D[r1+r2],
Message[Point2D::noRatio,r1,r2];$Failed,
Point2D[{x1*r2+x2*r1,y1*r2+y2*r1}/(r1+r2)]];
Point2D::parallel=
"No intersection point exists; lines ‘1‘ and ‘2‘ are parallel.";
Point2D[L1:Line2D[A1_,B1_,C1_],L2:Line2D[A2_,B2_,C2_]] :=
Which[
IsCoincident2D[L1,L2],
Message[Point2D::coincident,L1,L2];$Failed,
IsParallel2D[L1,L2],
Message[Point2D::parallel,L1,L2];$Failed,
True,
Point2D[{B1*C2-B2*C1,A2*C1-A1*C2}/(A1*B2-A2*B1)] ];
Point2D[Q1:Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Module[{disc=b^2-4*a*c},
If[IsZero2D[disc],
Message[Point2D::notCentral,Q1];$Failed,
Point2D[{2*c*d-b*e,2*a*e-b*d}/(b^2-4*a*c)]] ];
Point2D::noPole=
"Since ‘1‘ passes through the center of the conic, no pole point
exists.";
Point2D[L1:Line2D[A1_,B1_,C1_],Q2:Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Module[{q12,q1,q2},
q12=A1*(b*e-2*c*d)+B1*(b*d-2*a*e)+C1*(4*a*c-b^2);
If[IsZero2D[q12],
Message[Point2D::noPole,L1,Q2];$Failed,
q1=A1*(4*c*f-e^2)+B1*(d*e-2*b*f)+C1*(b*e-2*c*d);
q2=A1*(d*e-2*b*f)+B1*(4*a*f-d^2)+C1*(b*d-2*a*e);
Point2D[{q1,q2}/q12]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DPoint2D‘" *)
D2DQuadratic2D
Initialization
BeginPackage["D2DQuadratic2D‘", {"D2DEquations2D‘", "D2DExpressions2D‘",
"D2DLine2D‘", "D2DLoci2D‘", "D2DMaster2D‘", "D2DNumbers2D‘", "D2DPoint2D‘",
"D2DSketch2D‘", "D2DTransform2D‘"}];
D2DQuadratic2D::usage=
"D2DQuadratic2D is a package providing support for the quadratic
object.";
Quadratic2D::usage=
"Quadratic2D[a,b,c,d,e,f] represents the polynomial
a*x^2+b*x*y+c*y^2+d*x+e*y+f.";
Begin["‘Private‘"];
Description
Representation
Quadratic2D[a, b, c, d, e, f] A quadratic is used to represent a quadratic polynomial in
two unknowns. Quadratic2D[a, b, c, d, e, f] represents ax2 + bxy + cy 2 + dx + ey + f .
Graphics
Provides graphics primitives for a quadratic by extending the Mathematica Display command.
Executed when the package is loaded.
SetDisplay2D[
Quadratic2D[a_,b_,c_,d_,e_,f_],
Loci2D[Quadratic2D[a,b,c,d,e,f]]];
497
498 D2DQuadratic2D - Transformations
Validation
Quadratic2D[a, b, c, d, e, f] Detects a quadratic with imaginary coefficients and returns
the $Failed symbol. If the imaginary parts are insignificant, they are removed.
Quadratic2D::imaginary=
"An invalid quadratic of the form ’Quadratic2D[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘,
‘6‘]’ has been detected; the arguments cannot be imaginary.";
Quadratic2D[a_,b_,c_,d_,e_,f_] :=
(Quadratic2D @@ ChopImaginary2D[Quadratic$2D[a,b,c,d,e,f]]) /;
(FreeQ[{a,b,c,d,e,f},_Pattern] && IsTinyImaginary2D[{a,b,c,d,e,f}]);
Quadratic2D[a_,b_,c_,d_,e_,f_] :=
(Message[Quadratic2D::imaginary,a,b,c,d,e,f];$Failed) /;
(FreeQ[{a,b,c,d,e,f},_Pattern] && IsComplex2D[{a,b,c,d,e,f},0]);
Quadratic2D[a_,b_,c_,d_,e_,f_] :=
(Message[Quadratic2D::invalid,a,b,c,d,e,f];$Failed) /;
(FreeQ[{a,b,c,d,e,f},_Pattern] && IsZero2D[{a,b,c,d,e},And,0]);
Quadratic2D[a_,b_,c_,d_,e_,f_] :=
(Quadratic2D @@ ({a,b,c,d,e,f}/Sqrt[a^2+b^2+c^2+d^2+e^2])) /;
(FreeQ[{a,b,c,d,e,f},_Pattern] && IsZero2D[{a,b,c,d,e},And]);
Transformations
Reflect
Reflect2D[quad, line] Reflects a quadratic in a line.
Reflect2D[Q:Quadratic2D[a_,b_,c_,d_,e_,f_],L:Line2D[p_,q_,r_]] :=
Module[{eq1,eq2,x,y},
eq1=Equation2D[Q,{x,y}];
eq2=Reflect2D[eq1,{x,y},L];
Quadratic2D[eq2,{x,y}] ];
D2DQuadratic2D - Quadratic Construction 499
Rotate
Rotate2D[quad, θ, coords] Rotates a quadratic by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Q:Quadratic2D[a_,b_,c_,d_,e_,f_],theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Module[{eq1,eq2,x,y},
eq1=Equation2D[Q,{x,y}];
eq2=Rotate2D[eq1,{x,y},theta,{h,k}];
Quadratic2D[eq2,{x,y}] ];
Scale
Scale2D[quad, s, coords] Scales a quadratic from a position given by coordinates. If the
third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Q:Quadratic2D[a_,b_,c_,d_,e_,f_],s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Module[{eq1,eq2,x,y},
eq1=Equation2D[Q,{x,y}];
eq2=Scale2D[eq1,{x,y},s,{h,k}];
Quadratic2D[eq2,{x,y}] ] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[quad, {u, v}] Translates a quadratic delta distance.
Translate2D[Quadratic2D[a_,b_,c_,d_,e_,f_],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Quadratic2D[a,b,c,d-2*a*u-b*v,e-2*c*v-b*u,
a*u^2+b*u*v+c*v^2-u*d-v*e+f];
Quadratic Construction
Simplify and FullSimplify
Simplify[quad] and FullSimplify[quad] Extends the Mathematica Simplify and
FullSimplify commands to simplify the coefficients of a quadratic by factoring out com-
mon factors. Executed when the package is loaded.
protected=Unprotect[Simplify];
Simplify[expr_?(!FreeQ[#,Quadratic2D[a_,b_,c_,d_,e_,f_]]&),
opts___] :=
Simplify[expr /. Quadratic2D[a_,b_,c_,d_,e_,f_] :>
(Quadratic$2D @@
SimplifyCoefficients2D[{a,b,c,d,e,f}]),
opts] /. Quadratic$2D->Quadratic2D;
Protect[Evaluate[protected]];
500 D2DQuadratic2D - Quadratic Construction
protected=Unprotect[FullSimplify];
FullSimplify[expr_?(!FreeQ[#,Quadratic2D[a_,b_,c_,d_,e_,f_]]&),
opts___] :=
FullSimplify[expr /. Quadratic2D[a_,b_,c_,d_,e_,f_] :>
(Quadratic$2D @@
SimplifyCoefficients2D[{a,b,c,d,e,f}]),
opts] /. Quadratic$2D->Quadratic2D;
Protect[Evaluate[protected]];
Normalize
Quadratic2D[quad] Normalizes the coefficients of a quadratic so that the sum of the
squares of the first five coefficients equals one.
Quadratic2D[Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
(Quadratic2D @@ ({a,b,c,d,e,f}/Sqrt[a^2+b^2+c^2+d^2+e^2]));
Quadratic2D[expr_,{x_,y_}] :=
Module[{eqn,a,b,c,d,e,f},
eqn=If[Head[expr]===Equal,
expr[[1]]-expr[[2]],
expr] //Expand;
a=Coefficient[eqn,x^2];
b=Coefficient[eqn,x*y];
c=Coefficient[eqn,y^2];
d=Coefficient[Expand[eqn /. {x*y->0}],x];
e=Coefficient[Expand[eqn /. {x*y->0}],y];
f=(eqn /. {x->0,y->0}) //Expand;
If[IsZero2D[a*x^2+b*x*y+c*y^2+d*x+e*y+f-eqn],
Quadratic2D[a,b,c,d,e,f],
Message[Quadratic2D::noPoly,expr,x,y];$Failed] ];
Quadratic2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}],Point2D[{x3_,y3_}]] :=
Module[{eqn,x,y},
eqn=Det[{{ x^2+ y^2, x, y,1},
{x1^2+y1^2,x1,y1,1},
{x2^2+y2^2,x2,y2,1},
{x3^2+y3^2,x3,y3,1}}];
Quadratic2D[eqn,{x,y}] ];
Quadratic2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}],Point2D[{x3_,y3_}],
Point2D[{x4_,y4_}],Point2D[{x5_,y5_}]] :=
Module[{full,a,b,c,d,e,f},
full={{x1^2, x2^2, x3^2, x4^2, x5^2},
{x1*y1,x2*y2,x3*y3,x4*y4,x5*y5},
{y1^2, y2^2, y3^2, y4^2, y5^2},
{x1, x2, x3, x4, x5},
{y1, y2, y3, y4, y5},
{1, 1, 1, 1, 1}};
{a,b,c,d,e,f}=Map[Det[Transpose[Drop[full,{#}]]]&,{1,2,3,4,5,6}];
Quadratic2D[a,-b,c,-d,e,-f] ];
Reciprocal$2D[Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Quadratic2D[4*c*f-e^2,2*d*e-4*b*f,4*a*f-d^2,
4*c*d-2*b*e,4*a*e-2*d*b,4*a*c-b^2];
Quadratic2D[L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_],
L3:Line2D[a3_,b3_,c3_],L4:Line2D[a4_,b4_,c4_],
L5:Line2D[a5_,b5_,c5_]] :=
Module[{u,v,lns,Q},
{u,v}={Random[Integer,{-5,5}],Random[Integer,{-5,5}]};
lns=Translate2D[{L1,L2,L3,L4,L5},{u,v}];
Q=Quadratic2D[lns];
Translate2D[Q,{-u,-v}] ] /;
IsZero2D[{c1,c2,c3,c4,c5},Or];
502 D2DQuadratic2D - Quadratic Construction
Quadratic2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_],
Line2D[a3_,b3_,c3_],Line2D[a4_,b4_,c4_],
Line2D[a5_,b5_,c5_]] :=
Reciprocal$2D[
Quadratic2D[
Point2D[{-a1/c1,-b1/c1}],Point2D[{-a2/c2,-b2/c2}],
Point2D[{-a3/c3,-b3/c3}],Point2D[{-a4/c4,-b4/c4}],
Point2D[{-a5/c5,-b5/c5}]]] /;
Not[IsZero2D[{c1,c2,c3,c4,c5},Or]];
Quadratic2D[Line2D[a1_,b1_,c1_],Line2D[a2_,b2_,c2_]] :=
Quadratic2D[a1*a2,a1*b2+a2*b1,b1*b2,a1*c2+a2*c1,b1*c2+b2*c1,c1*c2];
Quadratic2D::eccentricity=
"The eccentricity ‘1‘ is invalid; the eccentricity must be positive.";
Quadratic2D[Point2D[{x1_,y1_}],L2:Line2D[a2_,b2_,c2_],e_?IsScalar2D] :=
Module[{l,m,r},
If[IsZeroOrNegative2D[e],
Message[Quadratic2D::eccentricity,e];$Failed,
{p,q,r}=List @@ Line2D[L2];
Quadratic2D[e^2*p^2-1, 2*e^2*p*q, e^2*q^2-1,
2*(x1+e^2*p*r), 2*(y1+e^2*q*r),e^2*r^2-x1^2-y1^2]] ];
Quadratic2D::invLen=
"A non-positive focal chord length, ‘1‘, is invalid; no valid quadratic
can be constructed.";
Quadratic2D::invEcc=
"A negative eccentricity, ‘1‘, is invalid; no valid quadratic can be
constructed.";
Quadratic2D[P1:Point2D[{x1_,y1_}],fcLen_?IsScalar2D,e_?IsScalar2D] :=
Quadratic2D[P1,fcLen,e,0];
D2DQuadratic2D - Epilogue 503
Quadratic2D[Point2D[{x1_,y1_}],fcLen_?IsScalar2D,
e_?IsScalar2D,theta_?IsScalar2D] :=
Module[{eqn,x,y},
Which[
IsZeroOrNegative2D[fcLen],
Message[Quadratic2D::invLen,fcLen];$Failed,
IsNegative2D[e],
Message[Quadratic2D::invEcc,e];$Failed,
True,
eqn=(y-y1)^2==fcLen*(x-x1)-(1-e^2)(x-x1)^2;
Rotate2D[Quadratic2D[eqn,{x,y}],theta,{x1,y1}]] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DQuadratic2D‘" *)
D2DSegment2D
Initialization
BeginPackage["D2DSegment2D‘", {"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘",
"D2DPoint2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DSegment2D::usage=
"D2DSegment2D is a package providing support for line segments.";
Length2D::usage=
"Length2D[lnseg] computes the length of a line segment.";
Segment2D::usage=
"Segment2D[{x0,y0},{x1,y1}] is the standard form of a line segment with
end points {x0,y0} and {x1,y1}.";
Begin["‘Private‘"];
Description
Representation
Segment2D[{x0, y0 }, {x1 , y1 }] Standard representation of a line segment in Descarta2D.
The coordinates {x0 , y0 } and {x1 , y1 } are start and end points, respectively, of the line
segment.
Evaluation
Segment2D[{x0, y0 }, {x1 , y1 }][t] Evaluates a parameter, −∞ < t < ∞, on a line
segment. The parameter values 0 and 1 are the start and end points, respectively. Returns a
coordinate list {x, y}.
Segment2D[{x0_,y0_},{x1_,y1_}][t_?IsScalar2D] :=
{x0+t*(x1-x0), y0+t*(y1-y0)};
505
506 D2DSegment2D - Description
Graphics
Provides graphics primitives for a line segment by extending the Mathematica Display com-
mand. Executed when the package is loaded.
SetDisplay2D[
Segment2D[{x0_,y0_},{x1_,y1_}][{t1_?IsScalar2D,t2_?IsScalar2D}],
Line[{Segment2D[{x0,y0},{x1,y1}][t1],
Segment2D[{x0,y0},{x1,y1}][t2]}] ];
SetDisplay2D[
Segment2D[{x0_,y0_},{x1_,y1_}],
Line[{{x0,y0},{x1,y1}}] ];
Validation
Segment2D[{x0, y0 }, {x1 , y1 }] Detects line segments with imaginary arguments and
returns the $Failed symbol. If the imaginary parts are insignificant, they are removed.
Segment2D::imaginary=
"An invalid line segment of the form Segment2D[‘1‘,‘2‘] has been
detected; the arguments cannot be imaginary.";
Segment2D[{x0_,y0_},{x1_,y1_}] :=
(Segment2D @@ ChopImaginary2D[Segment$2D[{x0,y0},{x1,y1}]]) /;
(FreeQ[{x0,y0,x1,y1},_Pattern] && IsTinyImaginary2D[{x0,y0,x1,y1}]);
Segment2D[{x0_,y0_},{x1_,y1_}] :=
(Message[Segment2D::imaginary,{x0,y0},{x1,y1}];$Failed) /;
(FreeQ[{x0,y0,x1,y1},_Pattern] && IsComplex2D[{x0,y0,x1,y1},0]);
Segment2D[{x0, y0 }, {x1 , y1 }] Returns the $Failed symbol for line segments with coin-
cident start and end points.
Segment2D::invalid=
"An invalid line segment of the form Segment2D[‘1‘,‘2‘] has been
detected; the defining coordinates cannot be coincident.";
Segment2D[{x0_,y0_},{x1_,y1_}] :=
(Message[Segment2D::invalid,{x0,y0},{x1,y1}];$Failed) /;
(FreeQ[{x0,y0,x1,y1},_Pattern] && IsCoincident2D[{x0,y0},{x1,y1}]);
IsValid2D[
Segment2D[{x0_?IsScalar2D,y0_?IsScalar2D},
{x1_?IsScalar2D,y1_?IsScalar2D}]] := True;
D2DSegment2D - Scalars 507
Scalars
Length
Length2D[lnseg] Computes the length of a line segment.
Length2D[Segment2D[{x0_,y0_},{x1_,y1_}]] := Sqrt[(x0-x1)^2+(y0-y1)^2];
Slope
Slope2D[lnseg] Computes the slope of a line segment.
Slope2D[Segment2D[{x0_,y0_},{x1_,y1_}]] :=
If[IsZero2D[x1-x0],Infinity,(y1-y0)/(x1-x0)];
Transformations
Reflect
Reflect2D[lnseg, line] Reflects a line segment in a line.
Reflect2D[Segment2D[{x0_,y0_},{x1_,y1_}],L2:Line2D[a_,b_,c_]] :=
Segment2D[Reflect2D[{x0,y0},L2],Reflect2D[{x1,y1},L2]];
Rotate
Rotate2D[lnseg, θ, coords] Rotates a line segment by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Segment2D[{x0_,y0_},{x1_,y1_}],theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Segment2D[Rotate2D[{x0,y0},theta,{h,k}],
Rotate2D[{x1,y1},theta,{h,k}]];
Scale
Scale2D[lnseg, s, coords] Scales a line segment from a position given by coordinates. If
the third argument is omitted it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Segment2D[{x0_,y0_},{x1_,y1_}],s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Segment2D[Scale2D[{x0,y0},s,{h,k}],Scale2D[{x1,y1},s,{h,k}]] /;
Not[IsZeroOrNegative2D[s]];
508 D2DSegment2D - Line Construction
Translate
Translate2D[lnseg, {u, v}] Translates a line segment delta distance.
Translate2D[Segment2D[{x0_,y0_},{x1_,y1_}],{u_?IsScalar2D,v_?IsScalar2D}]
:=
Segment2D[{x0+u,y0+v},{x1+u,y1+v}];
Point Construction
Midpoint
Point2D[lnseg] Constructs the midpoint of a line segment.
Point2D[Segment2D[{x0_,y0_},{x1_,y1_}]] := Point2D[{x0+x1,y0+y1}/2];
Segment2D[Point2D[{x0_,y0_}],Point2D[{x1_,y1_}]] :=
Segment2D[{x0,y0},{x1,y1}];
Line Construction
Line from Line Segment
Line2D[lnseg] Constructs a line containing a line segment.
Line2D[Segment2D[{x0_,y0_},{x1_,y1_}]] :=
Line2D[-(y1-y0),(x1-x0),(x0*y1-x1*y0)];
Line2D[Segment2D[{x0_,y0_},{x1_,y1_}],Perpendicular2D] :=
Line2D[2*(x1-x0),2*(y1-y0),x0^2-x1^2+y0^2-y1^2];
D2DSegment2D - Circle Construction 509
Circle Construction
Circle from Diameter Chord
Circle2D[lnseg] Constructs a circle from a line segment that is one of the circle’s diameter
chords.
Circle2D[Segment2D[{x0_,y0_},{x1_,y1_}]] :=
Circle2D[{(x0+x1)/2,(y0+y1)/2},Sqrt[(x0-x1)^2+(y0-y1)^2]/2];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DSegment2D‘" *)
D2DSketch2D
The package D2DSketch2D provides the Sketch2D command which is the basic command for
plotting Descarta2D objects.
Initialization
BeginPackage["D2DSketch2D‘", {"D2DExpressions2D‘", "D2DMaster2D‘"}];
D2DSketch2D::usage=
"D2DSketch2D is a package providing sketching functions.";
AskCurveLength2D::usage=
"AskCurveLength2D[ ] returns the value of the option CurveLength2D for
the Sketch2D function (the approximate sketched length of an unbounded
curve).";
CurveLength2D::usage=
"CurveLength2D->n is an option for the Sketch2D function to specify the
approximate sketched length of an unbounded curve.";
CurveLimits2D::usage=
"CurveLimits2D[{x,y},curve] returns a list of two parameter values,
{-t,t}, so that the distance the point on the unbounded curve at the
parameter ’t’ is a distance CurveLength2D/2 from the given coordinates.";
IsDisplay2D::usage=
"IsDisplay2D[object] returns ’True’ if the object can be displayed.";
MakePrimitives2D::usage=
"MakePrimitives2D[object,{t1,t2}] returns a list of graphics primitives
between a pair of parameters for a parametrically defined curve.";
SetDisplay2D::usage=
"SetDisplay2D[objPatt,objPrim] modifies the Display command to allow
plotting of a new object.";
Sketch2D::usage=
"Sketch2D[objList,opts] sketches a list of geometric objects.";
Begin["‘Private‘"];
511
512 D2DSketch2D - Plotting
Utilities
Filter Options
The private function FilterOptions$2D filters a list of options and provides a Sequence of
valid options for the specified command.
FilterOptions$2D[command_Symbol,opts___] :=
Module[{keywords = First /@ Options[command]},
Sequence @@ Select[{opts},MemberQ[keywords,First[#]]&] ];
Plotting
Set Display
SetDisplay2D[objPatt, objPrim] Modifies the Mathematica Display command to enable
plotting of a new object. The argument objPatt is a pattern which matches the standard
form of the object used in Descarta2D; the argument objPrim provides the commands that
generate the primitives required to plot the object.
SetAttributes[SetDisplay2D,HoldAll];
SetDisplay2D[objPatt_,objPrim_] :=
Module[{protected},
protected=Unprotect[Display];
Display[ch_,prim_?(!FreeQ[#,objPatt]&),format___] :=
Display[ch,prim /. {objPatt :> objPrim},format];
Protect[Evaluate[protected]];
IsDisplay2D[obj:objPatt] :=
IsValid2D[obj /. h_[a___][t___]->h[a]] &&
IsNumeric2D[obj /. h_[a___][t___]->h[a]] &&
IsNumeric2D[obj /. h_[a___][t___]->{t}];
Null];
Display Query
IsDisplay2D[object] Returns True if the object can be displayed and has parameters that
can be evaluated to real numbers; otherwise, returns False. The function SetDisplay2D,
above, provides the implementation of IsDisplay2D for each object after its display graphics
are defined.
IsDisplay2D[___] := False;
Curve Length
CurveLength2D->n The option CurveLength2D of the Sketch2D command specifies the
plotted length of an infinite curve and is measured from the midpoint to one of the plotted
end points of the curve.
D2DSketch2D - Plotting 513
Sketch2D::invalidLength=
"Option CurveLength2D->‘1‘ is invalid; ’CurveLength2D’ must be positive;
the current value of CurveLength2D->‘2‘ will be retained.";
protected=Unprotect[SetOptions];
SetOptions[Sketch2D,opts1___,CurveLength2D->n_,opts2___] :=
Message[Sketch2D::invalidLength,n,AskCurveLength2D[ ]] /;
(IsZeroOrNegative2D[n] || !IsReal2D[n]);
Protect[Evaluate[protected]];
AskCurveLength2D[ ] := Options[Sketch2D,CurveLength2D][[1,2]];
Sketch
Sketch2D[objList, opts] Plots a list of Descarta2D objects. The options may be any
options supported by the Mathematica Graphics command. The list is flattened before it is
plotted.
Sketch2D::noObj="No valid objects to sketch.";
514 D2DSketch2D - Epilogue
Sketch2D::notReal=
"<‘1‘> object(s) cannot be sketched.";
Options[Sketch2D] =
{Axes->True,
Frame->True,
AspectRatio->Automatic,
PlotRange->Automatic,
CurveLength2D->10};
Sketch2D[obj_List,opts___?OptionQ] :=
Module[{sketchOptsList,inputOptsList,allOptsList,
grOptsSequence,realObj,n,grafix},
sketchOptsList=Options[Sketch2D];
inputOptsList=Flatten[{opts}];
SetOptions[Sketch2D,
FilterOptions$2D[Sketch2D,
Sequence @@ inputOptsList]];
allOptsList=Flatten[Join[inputOptsList,sketchOptsList]];
grOptsSequence=FilterOptions$2D[Graphics, Sequence @@ allOptsList];
realObj=Select[Flatten[obj],IsDisplay2D] //N;
If[(n=Length[Flatten[obj]]-Length[realObj])>0,
Message[Sketch2D::notReal,n]];
grafix=If[Length[realObj]>0,
Show[Graphics[realObj,grOptsSequence]],
Message[Sketch2D::noObj];Null];
SetOptions[Sketch2D,Sequence @@ sketchOptsList];
grafix ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DSketch2D‘" *)
D2DSolve2D
The package D2DSolve2D provides the Solve2D function which is a specialized version of the
Mathematica Solve and NSolve commands.
Initialization
BeginPackage["D2DSolve2D‘", {"D2DExpressions2D‘"}];
D2DSolve2D::usage=
"D2DSolve2D is a package for solving equations.";
MaxSeconds2D::usage=
"MaxSeconds2D is an option of the Solve2D function that time constrains
the solution of the equations.";
Solve2D::usage=
"Solve2D[eqns,vars] solves a list of equations for variables in given in
a list.";
Options[Solve2D]=
{MaxSeconds2D->30};
Begin["‘Private‘"];
Symbol Queries
Single Symbol Query
The private function IsSymbol$2D[expr, symbol] returns True if the expression contains a
given symbol; otherwise, returns False.
IsSymbol$2D[expr_,sym_Symbol] := MemberQ[Level[expr,{-1}],sym];
515
516 D2DSolve2D - Solve
Solve
Maximum Seconds Option
MaxSeconds2D->n The option MaxSeconds2D specifies the maximum number of seconds
allowed to solve equations using Solve2D. The private function AskMaxSeconds$2D returns
the current setting for MaxSeconds2D.
Solve2D::invalidTime=
"Option MaxSeconds2D->‘1‘ is invalid; ’MaxSeconds2D’ must be positive;
the current value of MaxSeconds2D->‘2‘ will be retained.";
protected=Unprotect[SetOptions];
SetOptions[Solve2D,opts1___,MaxSeconds2D->n_,opts2___] :=
Message[Solve2D::invalidTime,n,AskMaxSeconds$2D[ ]] /;
(IsZeroOrNegative2D[n] || !IsReal2D[n]);
Protect[Evaluate[protected]];
AskMaxSeconds$2D[ ] := Options[Solve2D,MaxSeconds2D][[1,2]];
Solve
Solve2D[eqnList, varsList, opts] Solves a list of equations for a list of variables. Uses
the Mathematica function NSolve if any real numbers are involved, or if the Mathematica
function N is in the evaluation stack; otherwise, uses the Mathematica function Solve. An
empty list is returned (and a warning message output) if the equations cannot be solved in
the number of seconds specified by the option MaxSeconds2D->n.
Solve2D::infinite=
"An infinite number of solutions exist; only independent solutions will
be returned.";
Solve2D::time=
"The equations could not be solved in MaxSeconds2D->‘1‘, an empty list
of solutions will be returned; using approximate numbers may produce a more
complete list of solutions.";
SimplifyEquation$2D[eqn_Equal] :=
(eqn[[1]]//ExpandAll)==(eqn[[2]]//ExpandAll);
Solve2D[eqns:{HoldPattern[Equal[_,_]..]},
vars:{_Symbol..},
MaxSeconds2D->secs_] :=
Module[{save,result},
save=AskMaxSeconds$2D[ ];
SetOptions[Solve2D,MaxSeconds2D->secs];
result=Solve2D[eqns,vars];
SetOptions[Solve2D,MaxSeconds2D->save];
result ];
D2DSolve2D - Epilogue 517
Solve2D[eqns:{HoldPattern[Equal[_,_]..]},vars:{_Symbol..}] :=
Module[{save,ans},
save=Head[Solve::svars];Off[Solve::svars];
ans=TimeConstrained[
If[IsApproximate2D[eqns],
NSolve[Map[SimplifyEquation$2D,eqns]//N,vars,
WorkingPrecision->$MachinePrecision],
Solve[Map[SimplifyEquation$2D,eqns],vars]],
AskMaxSeconds$2D[ ],
Message[Solve2D::time,AskMaxSeconds$2D[ ]];{}];
If[save===String,On[Solve::svars]];
If[IsSymbol$2D[Map[(vars /. #)&,ans],vars],
Message[Solve2D::infinite];
Select[ans,Not[IsSymbol$2D[(vars /. #),vars]]&],
ans] ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DSolve2D‘" *)
D2DTangentCircles2D
Initialization
BeginPackage["D2DTangentCircles2D‘", {"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DPoint2D‘",
"D2DSolve2D‘"}];
D2DTangentCircles2D::usage=
"D2DTangentCircles2D is a package for constructing tangent circles.";
TangentCircles2D::usage=
"TangentCircles2D[objList,(center),(radius)] constructs a list of
circles tangent to one, two or three objects (points, lines or circles);
optionally, the center may be constrained to a point, line or circle;
optionally, the radius may be specified; the total number of constraints
must be three (constraining the center to a point is two constraints).";
Begin["‘Private‘"];
Queries
Point, Line or Circle Query
The private function IsSimple$2D returns True if an object is a point, line or circle; otherwise,
returns False.
IsSimple$2D[obj_] := Is2D[obj,{Point2D,Line2D,Circle2D}];
519
520 D2DTangentCircles2D - Tangent/On Equations
IsSimpleCurve$2D[obj_] := Is2D[obj,{Line2D,Circle2D}];
Tangent/On Equations
Point Tangent to a Circle (On Circle)
The private function TangentEquation$2D returns an equation constraining a point to be on
a circle.
TangentEquation$2D[Point2D[{x1_,y1_}],Circle2D[{h2_,k2_},r2_]] :=
(x1-h2)^2+(y1-k2)^2==r2^2;
Point on a Point
The private function OnEquation$2D returns a pair of equations constraining two points to
be coincident.
OnEquation$2D[{x1_,y1_},Point2D[{x2_,y2_}]] := {x1==x2, y1==y2};
Point on a Line
The private function OnEquation$2D returns equation constraining a point to be on a line.
OnEquation$2D[{x1_,y1_},Line2D[a2_,b2_,c2_]] := {a2*x1+b2*y1+c2==0};
Point on a Circle
The private function OnEquation$2D returns an equation constraining a point to be on a
circle.
OnEquation$2D[{x1_,y1_},Circle2D[{h2_,k2_},r2_]] :=
{(x1-h2)^2+(y1-k2)^2==r2^2};
D2DTangentCircles2D - General Circle Tangency 521
TangentCircles2D[{obj1_?IsSimple$2D,obj2_?IsSimple$2D},
r3_?IsScalar2D] :=
TangentCircles$2D[{obj1,obj2},Null,r3] /;
Not[IsZeroOrNegative2D[r3]];
TangentCircles2D[{obj1_?IsSimple$2D,obj2_?IsSimple$2D,
obj3_?IsSimple$2D}] :=
TangentCircles$2D[{obj1,obj2,obj3},Null,Null];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTangentCircles2D‘" *)
D2DTangentConics2D
The package D2DTangentConics2D provides functions for constructing conics and quadratics
that satisfy five conditions. Each condition may be either passing through a given point or
tangent to a given line.
Initialization
BeginPackage["D2DTangentConics2D‘",{"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DExpressions2D‘", "D2DGeometry2D‘", "D2DHyperbola2D‘", "D2DLine2D‘",
"D2DLoci2D‘", "D2DMaster2D‘", "D2DParabola2D‘", "D2DPencil2D‘",
"D2DPoint2D‘", "D2DQuadratic2D‘", "D2DSolve2D‘", "D2DTransform2D‘"}];
D2DTangentConics2D::usage=
"D2DTangentConics2D is a package for constructing tangent conics and
quadratics.";
TangentConics2D::usage=
"TangentConics2D[{obj1,obj2,obj3,obj4,obj5}] constructs list of conic
curves given five objects; the objects may be any combination of points and
lines; the conics will pass through the given points and be tangent to the
given lines.";
TangentQuadratics2D::usage=
"TangentQuadratics2D[{obj1,obj2,obj3,obj4,obj5}] constructs list of
quadratics given five objects; the objects may be any combination of points
and lines; the quadratics will pass through the given points and be tangent
to the given lines.";
Begin["‘Private‘"];
Error Messages
General Error Messages
TangentConics2D::coincident=
"Two or more of the defining points or lines are coincident; no proper
conic can be constructed.";
523
524 D2DTangentConics2D - Utilities
TangentConics2D::collinear=
"Three or more of the defining points are collinear; no proper conic can
be constructed.";
TangentConics2D::concurrent=
"Three or more of the tangent lines are concurrent; no proper conic can
be constructed.";
TangentConics2D::linesThru=
"One of the points is on more than one of the tangent lines; no proper
conic can be constructed.";
TangentConics2D::parallel=
"Three or more of the defining lines are parallel; no proper conic can
be constructed.";
TangentConics2D::pointsOn=
"Two or more of the points are on a tangent line; no proper conic can be
constructed.";
Utilities
Numeric Computations
The private function N$2D numerically normalizes lines and quadratics (or lists of such objects)
if approximate numerical computations are underway; otherwise, no action is taken.
N$2D[expr_List] := Map[N$2D,expr];
N$2D[L:Line2D[a_,b_,c_]] :=
If[IsApproximate2D[L],Line2D[ N[L] ],L];
N$2D[P:Point2D[{x_,y_}]] :=
If[IsApproximate2D[P],N[P],P];
N$2D[Q:Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
If[IsApproximate2D[Q],Quadratic2D[ N[Q] ],Q];
The private function MaxPointsOn$2D returns the maximum number of points from a given
list that are on any of the lines in a list.
MaxPointsOn$2D[pts_List,lns_List] :=
If[Length[pts]<1 || Length[lns]<1,
0,
Max @@ Map[CountPointsOn$2D[pts,#]&,lns] ];
D2DTangentConics2D - Utilities 525
CountLinesThru$2D[lns_List,P:Point2D[{x_,y_}]] :=
Count[Map[IsOn2D[P,#]&, lns], True];
The private function MaxLinesThru$2D returns the maximum number of lines from a given
list that pass through any of the points in a list.
MaxLinesThru$2D[lns_List,pts_List] :=
If[Length[lns]<1 || Length[pts]<1,
0,
Max @@ Map[CountLinesThru$2D[lns,#]&,pts] ];
Validity Queries
The private function ValidObjects$2D verifies that the object list contains valid objects.
The function private ValidConfigurationQ$2D verifies that the configuration of the objects
is valid.
ValidObjectsQ$2D[obj_List,funcName_] :=
((Count[Map[IsValid2D,obj],True]==
Count[Map[Is2D[#,{Point2D,Line2D}]&,obj],True]==
Length[obj]==5) &&
IsNumeric2D[obj,funcName]);
ValidConfigurationQ$2D[obj_List] :=
Module[{pts,lns},
pts=Select[N$2D[obj],Is2D[#,{Point2D}]&];
lns=Select[N$2D[obj],Is2D[#,{Line2D}]&];
Which[
IsCoincident2D[pts],
Message[TangentConics2D::coincident];False,
IsCoincident2D[lns],
Message[TangentConics2D::coincident];False,
IsCollinear2D[pts],
Message[TangentConics2D::collinear];False,
IsConcurrent2D[lns],
Message[TangentConics2D::concurrent];False,
IsTripleParallel2D[lns],
Message[TangentConics2D::parallel];False,
MaxPointsOn$2D[pts,lns]>1,
Message[TangentConics2D::pointsOn];False,
MaxLinesThru$2D[lns,pts]>1,
Message[TangentConics2D::linesThru];False,
True,
True] ];
526 D2DTangentConics2D - Quadratic and Conic Construction
Polynomials
Point on Line
The private function Polynomial$2D forms a polynomial by substituting the coordinates of a
point into the equation of a line.
Polynomial$2D[Point2D[{x_,y_}],Line2D[a_,b_,c_]] := a*x+b*y+c;
Point on Quadratic
The private function Polynomial$2D forms a polynomial by substituting the coordinates of a
point into a quadratic equation.
Polynomial$2D[Point2D[{x_,y_}],Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
a*x^2+b*x*y+c*y^2+d*x+e*y+f;
Polynomial$2D[Line2D[p_,q_,r_],Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
((4*c*f-e^2)*p^2+(4*a*f-d^2)*q^2+(4*a*c-b^2)*r^2+
2*(b*d-2*a*e)*q*r+2*(b*e-2*c*d)*p*r+2*(d*e-2*b*f)*p*q);
TangentQuadratics2D[obj_List] :=
If[ValidConfigurationQ$2D[obj],
TangentQuadratic$2D[obj//N$2D],
{}] /;
ValidObjectsQ$2D[obj,TangentQuadratics2D];
TangentConics2D[obj_List] :=
Module[{Q,conics},
If[ValidConfigurationQ$2D[obj],
Q=TangentQuadratics2D[obj//N$2D];
conics=Flatten[Map[Loci2D,Q]];
Union[
Select[conics,
Is2D[#,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D}]&]],
{}] ] /;
ValidObjectsQ$2D[obj,TangentConics2D];
Preprocess Arguments
Preprocesses the arguments to private function TangentQuadratic$2D to match the imple-
mented functions.
TangentQuadratic$2D[{a_,b_,c_,d_,e_}] :=
TangentQuadratic$2D[a,b,c,d,e];
TangentQuadratic$2D[a___,L1_Line2D,b___,L2_Line2D,c___,L3_Line2D,d___] :=
TangentInverse$2D[{L1,L2,L3,a,b,c,d}];
TangentQuadratic$2D[a___,L_Line2D,b___,P_Point2D,c___] :=
TangentQuadratic$2D[a,P,b,c,L];
TangentQuadratic$2D[a___,P_Point2D,b___,L_Line2D,c___] :=
(TangentQuadratic$2D[{P,L},a,b,c]) /;
IsOn2D[P,L];
Five Points
Private function that constructs a list containing one quadratic passing through five points.
TangentQuadratic$2D[P1_,P2_,P3_,P4_,P5_] :=
{Quadratic2D[P1,P2,P3,P4,P5] //N$2D};
TangentQuadratic$2D[P1_Point2D,P2_Point2D,P3_Point2D,P4_Point2D,
L5_Line2D] :=
Module[{Q,k,allRoots,realRoots},
Q=Quadratic2D[{Line2D[P1,P2],Line2D[P3,P4]},
{Line2D[P1,P3],Line2D[P2,P4]},k,Pencil2D] //N$2D;
allRoots=Solve2D[{Polynomial$2D[L5,Q]==0},{k}];
realRoots=Select[allRoots,IsReal2D[k /. #]&];
N$2D[Map[(Q /. #)&, realRoots]] ];
528 D2DTangentConics2D - Quadratic and Conic Construction
TangentQuadratic$2D[P1:Point2D[{x1_,y1_}],P2:Point2D[{x2_,y2_}],
P3:Point2D[{x3_,y3_}],
L1:Line2D[a1_,b1_,c1_],L2:Line2D[a2_,b2_,c2_]] :=
Module[{pt2,pt3,ln1,ln2,Q},
{pt2,pt3,ln1,ln2}=Translate2D[{P2,P3,L1,L2},{-x1,-y1}] //N$2D;
Q=TangentQuadratic$2D[Point2D[{0,0}],pt2,pt3,ln1,ln2];
N$2D[Translate2D[Q,{x1,y1}]] ];
TangentQuadratic$2D[{P1_Point2D,L1_Line2D},
{P3_Point2D,L3_Line2D},P2:Point2D[{x2_,y2_}]] :=
Module[{x,y,ln13,ln1,ln3,k},
ln13=Polynomial$2D[Point2D[{x,y}],Line2D[P1,P3]];
ln1=Polynomial$2D[Point2D[{x,y}],L1];
ln3=Polynomial$2D[Point2D[{x,y}],L3];
k=(ln1*ln3)/ln13^2 /. {x->x2,y->y2};
{Quadratic2D[ln1*ln3-k*ln13^2,{x,y}] //N$2D} ];
Reciprocal Method
Private function that constructs a list containing quadratics given five elements (points or
tangent lines). The method of reciprocals is used. Using the reciprocal method converts a
case with more than two tangent lines to its reciprocal, which has two or fewer tangent lines.
TangentInverse$2D[origObjs_List] :=
Module[{offset,objsTrans,invertedObjs,Q},
offset=SaveOffset$2D[origObjs];
objsTrans=Translate2D[origObjs,-offset];
invertedObjs=Map[Invert$2D,objsTrans] //N$2D;
Q=TangentQuadratic$2D[invertedObjs];
Translate2D[Map[Reciprocal$2D,Q],offset] //N$2D ];
Private functions that construct the pole point of a line with respect to a unit circle and the
polar line of a point with respect to a unit circle.
Invert$2D[Line2D[a_,b_,c_]] := Point2D[{-a/c,-b/c}];
Invert$2D[Point2D[{x_,y_}]] := Line2D[x,y,-1];
Private function that constructs the reciprocal quadratic of a quadratic with respect to a unit
circle.
Reciprocal$2D[Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
Quadratic2D[4*c*f-e^2,2*d*e-4*b*f,4*a*f-d^2,
4*c*d-2*b*e,4*a*e-2*d*b,4*a*c-b^2] //N$2D;
Private functions that determine an offset that will safely position a list of objects insuring
that no line passes through the center of inversion and no point is coincident with the center
of inversion.
InvalidOffsetQ$2D[P1:Point2D[{x1_,y1_}],offset:{dx_,dy_}] :=
IsCoincident2D[P1,Point2D[offset]];
530 D2DTangentConics2D - Epilogue
InvalidOffsetQ$2D[L1:Line2D[a1_,b1_,c1_],offset:{dx_,dy_}] :=
IsOn2D[Point2D[offset],L1];
SaveOffset$2D[obj_List] :=
Module[{offset={0,0}},
While[MemberQ[Map[InvalidOffsetQ$2D[#,offset]&,obj],
True],
offset={Random[Integer,{-4,4}],
Random[Integer,{-4,4}]}];
offset ];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTangentConics2D‘" *)
D2DTangentLines2D
The package D2DTangentLines2D provides functions for computing lines that are tangent to
curves using a variety of defining conditions.
Initialization
BeginPackage["D2DTangentLines2D‘", {"D2DCircle2D‘", "D2DConic2D‘",
"D2DEllipse2D‘", "D2DEquations2D‘", "D2DExpressions2D‘", "D2DGeometry2D‘",
"D2DHyperbola2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DParabola2D‘",
"D2DPoint2D‘", "D2DQuadratic2D‘", "D2DSegment2D‘", "D2DSolve2D‘",
"D2DTangentPoints2D‘", "D2DTransform2D‘"}];
D2DTangentLines2D::usage=
"D2DTangentLines2D is a package for constructing tangent lines and line
segments.";
TangentEquation2D::usage=
"TangentEquation2D[line, quad] constructs an equation involving the
coefficients of a line and a quadratic constraining the line to be tangent
to the quadratic.";
TangentLines2D::usage=
"TangentLines2D[point, curve] constructs a list of lines through a point
and tangent to a second-degree curve; TangentLines2D[line, curve,
Parallel2D] constructs a list of tangent lines parallel to a given line;
TangentLines2D[line, curve, Perpendicular2D] constructs a list of tangent
lines perpendicular to a given line; TangentLines2D[curve, curve]
constructs a list of lines tangent to two curves.";
TangentSegments2D::usage=
"TangentSegments2D[curve,curve] constructs a list of line segments
tangent to two curves.";
Begin["‘Private‘"];
531
532 D2DTangentLines2D - Line Construction
Tangent Equation
Line Tangent to a Quadratic
TangentEquation2D[line, quad] Forms an equation between the coefficients of a line and
a quadratic constraining the line to be tangent to the quadratic.
TangentEquation2D[Line2D[p_,q_,r_],
Quadratic2D[a_,b_,c_,d_,e_,f_]] :=
((4*c*f-e^2)*p^2+(4*a*f-d^2)*q^2+(4*a*c-b^2)*r^2+
2*(b*d-2*a*e)*q*r+2*(b*e-2*c*d)*p*r+2*(d*e-2*b*f)*p*q)==0;
Line Construction
Lines Through a Point Tangent to a Circle
TangentLines2D[point, circle] Constructs a list containing up to two lines through a point
and tangent to a circle.
TangentLines2D[Point2D[{x1_,y1_}],Circle2D[{h2_,k2_},r2_]] :=
Union[TangentLine$2D[{x1,y1},0,{h2,k2},r2,1]];
TangentLines2D[P1:Point2D[{x1_,y1_}],crv2_] :=
Module[{pts},
pts=TangentPoints2D[P1,crv2];
Which[
pts=={}, {},
Length[pts]==1, {Line2D[P1,crv2]},
True, Map[Line2D[P1,#]&,pts]] ] /;
Is2D[crv2,{Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
TangentLines2D[L:Line2D[p_,q_,r_],Q:Quadratic2D[a_,b_,c_,d_,e_,f_],
Parallel2D] :=
Module[{z,eq1,R,ans},
z=R*(-b^2+4*a*c)+q*(b*d-2*a*e)+p*(-2*c*d+b*e);
If[IsZero2D[z],{},
eq1=TangentEquation2D[Line2D[p,q,R],Q];
ans=Select[Solve2D[{eq1},{R}],
Not[IsComplex2D[R /. #]]&];
Map[Line2D[p,q,(R /. #)]&,ans]] ];
TangentLines2D[L:Line2D[a_,b_,c_],crv_,Parallel2D] :=
TangentLines2D[L,Quadratic2D[crv],Parallel2D] /;
Is2D[crv,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D}];
TangentLines2D[L:Line2D[a_,b_,c_],crv_] :=
TangentLines2D[L,crv,Parallel2D] /;
Is2D[crv,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
TangentLines2D[Line2D[a_,b_,c_],crv_,Perpendicular2D] :=
TangentLines2D[Line2D[-b,a,c],crv,Parallel2D] /;
Is2D[crv,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
TangentLines2D[Circle2D[{h1_,k1_},r1_],Circle2D[{h2_,k2_},r2_]] :=
Flatten[{Map[Union[TangentLine$2D[{h1,k1},r1,{h2,k2},r2,#]]&,{-1,1}]}];
TangentLine$2D[{h1_,k1_},r1_,{h2_,k2_},r2_,s_] :=
Module[{H=h1-h2,K=k1-k2,R=r1+s*r2,L,A2,B2,C2,lns,sv1,sv2},
L=H^2+K^2;
A2=A1*H-B1*K; B2=B1*H+A1*K; C2 =L*r1-h1*A2-k1*B2;
sv1=Head[Line2D::imaginary];Off[Line2D::imaginary];
sv2=Head[Line2D::invalid];Off[Line2D::invalid];
lns=Map[(Line2D[A2, B2, C2] /. #)&,
{{A1->R, B1-> Sqrt[L-R^2]},
{A1->R, B1->-Sqrt[L-R^2]}}];
If[sv1===String,On[Line2D::imaginary]];
If[sv2===String,On[Line2D::invalid]];
Select[lns,IsValid2D]];
TanLn$2D[Q1:Quadratic2D[a1_,b1_,c1_,d1_,e1_,f1_],
Q2:Quadratic2D[a2_,b2_,c2_,d2_,e2_,f2_]] :=
Module[{L,p,q,r,ans,lns,svMsg1,svMsg2},
L=Line2D[p,q,r];
ans=Solve2D[{TangentEquation2D[L,Q1],
TangentEquation2D[L,Q2],
p^2+q^2==1},{p,q,r}];
svMsg1=Head[Line2D::imaginary];Off[Line2D::imaginary];
svMsg2=Head[Line2D::invalid];Off[Line2D::invalid];
lns=Map[(L /. #)&,ans];
If[svMsg1===String,On[Line2D::imaginary]];
If[svMsg2===String,On[Line2D::invalid]];
Select[lns,IsValid2D] ];
DeleteCoincident$2D[{s1___,
L1:Line2D[a1_,b1_,c1_],s2___,
L2:Line2D[a2_,b2_,c2_],s3___}]:=
DeleteCoincident$2D[{s1,L1,s2,s3}] /;
IsCoincident2D[L1,L2];
DeleteCoincident$2D[lns_List]:=lns;
TangentLines2D[Q1:Quadratic2D[a1_,b1_,c1_,d1_,e1_,f1_],
Q2:Quadratic2D[a2_,b2_,c2_,d2_,e2_,f2_]] :=
If[IsCoincident2D[Q1,Q2],{},
DeleteCoincident$2D[TanLn$2D[Q1,Q2]]];
TangentLines2D[crv1_,crv2_] :=
Module[{Q1,Q2},
Q1=If[Is2D[crv1,{Quadratic2D}],crv1,Quadratic2D[crv1]];
Q2=If[Is2D[crv2,{Quadratic2D}],crv2,Quadratic2D[crv2]];
TangentLines2D[Q1,Q2]] /;
Is2D[crv1,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}] &&
Is2D[crv2,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
TangentSegments2D[crv1_,crv2_] :=
Module[{lns,svMsg1,svMsg2},
lns=TangentLines2D[crv1,crv2];
svMsg1=Head[Segment2D::imaginary];Off[Segment2D::imaginary];
svMsg2=Head[Segment2D::invalid];Off[Segment2D::invalid];
lns=Map[Segment2D[Point2D[#,crv1],Point2D[#,crv2]]&,lns];
If[svMsg1===String,On[Segment2D::imaginary]];
If[svMsg2===String,On[Segment2D::invalid]];
Select[lns,IsValid2D] ] /;
Is2D[crv1,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}] &&
Is2D[crv2,{Circle2D,Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTangentLines2D‘" *)
D2DTangentPoints2D
The package D2DTangentPoints2D provides functions for constructing the point of contact
between a curve and a tangent line.
Initialization
BeginPackage["D2DTangentPoints2D‘", {"D2DCircle2D‘", "D2DEllipse2D‘",
"D2DExpressions2D‘", "D2DGeometry2D‘", "D2DHyperbola2D‘",
"D2DIntersect2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DParabola2D‘",
"D2DPoint2D‘", "D2DQuadratic2D‘"}];
D2DTangentPoints2D::usage=
"D2DTangentPoints2D is a package for constructing tangent points.";
TangentPoints2D::usage=
"TangentPoints2D[point,curve] constructs a list containing points that
are the tangency points of the lines from a point to a curve.";
Begin["‘Private‘"];
Point Construction
Circle Contact Points
TangentPoints2D[point, circle] Constructs a list containing up to two points that are the
contact points of the lines tangent to a circle from a point. This is a simplified formula for
circles; the general second-degree form also produces the correct points (see below).
TangentPoints2D[Point2D[{x1_,y1_}],Circle2D[{h_,k_},r_]] :=
Module[{d,R,c,s,S},
d=(x1-h)^2+(y1-k)^2;
If[IsZero2D[d],{},
R=If[IsZero2D[d-r^2],0,d-r^2];
c=(r*(x1-h)-S*Sqrt[R]*(y1-k))/d;
s=(r*(y1-k)+S*Sqrt[R]*(x1-h))/d;
Map[(Point2D[{h+r*c,k+r*s}] /. S->#)&,
Which[IsZero2D[R],{1},
IsNegative2D[R], {},
True, {-1,1}]]] ];
537
538 D2DTangentPoints2D - Epilogue
TangentPoints2D[P1:Point2D[{x1_,y1_}],crv2_] :=
Module[{Q,a,b,c,d,e,f,p,q,r,pts},
Q=If[Head[crv2]===Quadratic2D,crv2,Quadratic2D[crv2]];
{a,b,c,d,e,f}=List @@ Q;
p=2*a*x1+b*y1+d; q=b*x1+2*c*y1+e; r=d*x1+e*y1+2*f;
Which[
IsZero2D[{p,q},And], {},
IsOn2D[P1,Q], {Point2D[Line2D[p,q,r],crv2]},
True, Points2D[Line2D[p,q,r],crv2]] ] /;
Is2D[crv2,{Ellipse2D,Hyperbola2D,Parabola2D,Quadratic2D}];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTangentPoints2D‘" *)
D2DTransform2D
The package D2DTransform2D provides the basic support for the transformations provided
by Descarta2D (reflect, rotate, scale and translate). Each Descarta2D object provides specific
support for the transformations using these basic capabilities.
Initialization
BeginPackage["D2DTransform2D‘", {"D2DExpressions2D‘", "D2DLine2D‘",
"D2DMaster2D‘"}];
D2DTransform2D::usage=
"D2DTransform2D is a package providing transformations.";
Reflect2D::usage=
"Reflect2D[obj,line] reflects an object in a line;
Reflect2D[objList,line] reflects a list of objects in a line;
Reflect[eqn,{x,y},line] reflects an equation in variables ’x’ and ’y’ in a
line.";
ReflectAngle2D::usage=
"ReflectAngle2D[theta,line] reflects an angle in a line.";
Rotate2D::usage=
"Rotate2D[obj,theta,{h,k}] rotates an object an angle ’theta’ about a
point with coordinates {h,k}; Rotate2D[objList,theta,{h,k}] rotates a list
of objects; Rotate2D[eqn,{x,y},{h,k}] rotates an equation in variables ’x’
and ’y’; if the {h,k} coordinates are omitted, the default is {0,0}.";
Scale2D::usage=
"Scale2D[obj,s,{h,k}] scales an object about coordinates {h,k} by scale
factor ’s’; Scale2D[objList,s,{h,k}] scales a list of objects;
Scale2D[eqn,{x,y},{h,k}] scales an equation in variables ’x’ and ’y’; if
the center of scaling {h,k} is omitted, the default is {0,0}.";
Translate2D::usage=
"Translate2D[obj,{u,v}] translates an object delta distance {u,v};
Translate2D[objList,{u,v}] translates a list of objects;
Translate2D[eqn,{x,y},{u,v}] translates an equation in variables ’x’ and
’y’.";
Begin["‘Private‘"];
539
540 D2DTransform2D - Reflect
Queries
Transformable Query
The private function IsTransformable$2D[ ] returns True if an object or all the objects in
a list are transformable; otherwise, returns False.
IsTransformable$2D[obj_List] :=
(And @@ Map[IsTransformableSingleLevel$2D[#]&,obj]) /;
Not[IsScalarPair2D[obj]];
IsTransformable$2D[obj_] := IsTransformableSingleLevel$2D[obj];
IsTransformableSingleLevel$2D[obj_] :=
(IsValid2D[obj] || IsScalarPair2D[obj]);
Reflect
Reflect Angle
ReflectAngle2D[θ, line] Reflects an angle in a line. This function is useful for reflecting
objects that are defined by rotation angles.
ReflectAngle2D[theta_?IsScalar2D,Line2D[a_,b_,c_]] :=
2*ArcTan[b,-a]-theta;
Reflect Coordinates
Reflect2D[{x, y}, line] Reflects a list of coordinates {x, y} in a line.
Reflect2D[{x_?IsScalar2D,y_?IsScalar2D},Line2D[a_,b_,c_]] :=
{x,y}-2*(a*x+b*y+c)*{a,b}/(a^2+b^2);
Reflect Equation
Reflect2D[eqn, {x, y}, line] Reflects an equation in the variables x and y in a line.
Reflect2D[eqn_Equal,{x_?IsScalar2D,y_?IsScalar2D},Line2D[a_,b_,c_]] :=
eqn /. {x->((b^2-a^2)*x-2*a*b*y-2*a*c)/(a^2+b^2),
y->((a^2-b^2)*y-2*a*b*x-2*b*c)/(a^2+b^2)};
Reflect List
Reflect2D[objList, line] Reflects a list of {x, y} coordinates or objects.
Reflect2D[obj_List?IsTransformable$2D,L:Line2D[a_,b_,c_]] :=
Map[Reflect2D[#,L]&, obj] /;
Not[IsScalarPair2D[obj]];
D2DTransform2D - Rotate 541
Rotate
Rotate About Origin
Rotate2D[object, θ] Rotates an object by an angle θ about the origin.
Rotate2D[obj_?IsTransformable$2D,theta_?IsScalar2D] :=
Rotate2D[obj,theta,{0,0}];
Rotate Coordinates
Rotate2D[coords, θ, coords] Rotates a coordinate list {x, y} by an angle θ about a position
specified by a coordinate list. If the third argument is omitted, it defaults to the origin.
Rotate2D[{x1_?IsScalar2D,y1_?IsScalar2D},theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
{h+((x1-h)*Cos[theta]-(y1-k)*Sin[theta]),
k+((x1-h)*Sin[theta]+(y1-k)*Cos[theta])};
Rotate Equation
Rotate2D[eqn, {x, y}, θ, coords] Rotates an equation in the variables x and y by an angle
θ about a position given by coordinates.
Rotate2D[eqn_Equal,{x_?IsScalar2D,y_?IsScalar2D},theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
eqn /. {x->h+(x-h)*Cos[theta]+(y-k)*Sin[theta],
y->k-(x-h)*Sin[theta]+(y-k)*Cos[theta]};
Rotate List
Rotate2D[objList, θ, coords] Rotates a list of {x, y} coordinates or objects by an angle
θ about a position specified by a coordinate list. If the third argument is omitted, it defaults
to the origin.
Rotate2D[obj_List?IsTransformable$2D,theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Map[Rotate2D[#,theta,{h,k}]&, obj] /;
Not[IsScalarPair2D[obj]];
Scale
Scale from Origin
Scale2D[object, s] Scales an object about the origin.
Scale2D[obj_?IsTransformable$2D,s_?IsScalar2D] :=
Scale2D[obj,s,{0,0}] /;
Not[IsZeroOrNegative2D[s]];
542 D2DTransform2D - Translate
Scales Coordinates
Scale2D[coords, s, coords] Scales a coordinate list from a position given by coordinates.
If the position is omitted, it defaults to the origin.
Scale2D[{x1_?IsScalar2D,y1_?IsScalar2D},s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
({h,k}+s*{x1-h,y1-k}) /;
Not[IsZeroOrNegative2D[s]];
Scale Equation
Scale2D[eqn, {x, y}, s, coords] Scales an equation in the variables x and y from a position
given by coordinates.
Scale2D[eqn_Equal,{x_?IsScalar2D,y_?IsScalar2D},s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
(eqn /. {x->h+(x-h)/s,y->k+(y-k)/s}) /;
Not[IsZeroOrNegative2D[s]];
Scale List
Scale2D[objList, s, coords] Scales a list of {x, y} coordinates or objects from a position
given by coordinates. If the position is omitted, it defaults to the origin.
Scale2D[obj_List,s_?IsScalar2D,{h_?IsScalar2D,k_?IsScalar2D}] :=
Map[Scale2D[#,s,{h,k}]&, obj] /;
(Not[IsScalarPair2D[obj]] && Not[IsZeroOrNegative2D[s]]);
Invalid Scale
Returns the $Failed symbol when Scale2D is called with a non-positive scale, s.
Scale2D::invalidScale=
"The scale factor ‘1‘ is invalid; the scale factor must be positive.";
Scale2D[obj_?IsTransformable$2D,s_?IsScalar2D,___] :=
(Message[Scale2D::invalidScale,s];$Failed) /;
IsZeroOrNegative2D[s];
Translate
Translate Coordinates
Translate2D[coords, {u, v}] Translates a coordinate list delta distance.
Translate2D[{x_?IsScalar2D,y_?IsScalar2D},
{u_?IsScalar2D,v_?IsScalar2D}] := {x+u,y+v};
D2DTransform2D - Epilogue 543
Translate Equation
Translate2D[eqn, {x, y}, {u, v}] Translates an equation in the variables x and y by delta
distance.
Translate2D[eqn_Equal,{x_?IsScalar2D,y_?IsScalar2D},
{u_?IsScalar2D,v_?IsScalar2D}] :=
(eqn /. {x->x-u,y->y-v});
Translate List
Translate2D[objList, {u, v}] Translates a list of {x, y} coordinates or objects delta
distance.
Translate2D[obj_List?IsTransformable$2D,
{u_?IsScalar2D,v_?IsScalar2D}] :=
Map[Translate2D[#,{u,v}]&, obj] /;
Not[IsScalarPair2D[obj]];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTransform2D‘" *)
D2DTriangle2D
Initialization
BeginPackage["D2DTriangle2D‘",{"D2DCircle2D‘", "D2DExpressions2D‘",
"D2DGeometry2D‘", "D2DLine2D‘", "D2DMaster2D‘", "D2DNumbers2D‘",
"D2DPoint2D‘", "D2DSegment2D‘", "D2DSketch2D‘", "D2DTransform2D‘"}];
D2DTriangle2D::usage=
"D2DTriangle2D is a package that implements the Triangle2D object.";
Centroid2D::usage=
"Centroid2D is the keyword required in Point2D[triangle, Centroid2D].";
Circumscribed2D::usage=
"Circumscribed2D is the keyword required in Circle2D[triangle,
Circumscribed2D]; it is also required in Point2D[triangle,
Circumscribed2D].";
Inscribed2D::usage=
"Inscribed2D is the keyword required in Circle2D[triangle, Inscribed2D];
it is also required in Point2D[triangle, Inscribed2D].";
SolveTriangle2D::usage=
"SolveTriangle2D[{{s1,s2,s3},{a1,a2,a3}}] computes a complete triangle
configuration of the form {{s1,s2,s3},{a1,a2,a3}} given three of the six
sides and/or angles; unspecified sides and/or angles should be specified as
Null; SolveTriangle2D[{{s1,s2,s3},{a1,a2,a3}}, True] computes an alternate
configuration, if one exists.";
Triangle2D::usage=
"Triangle2D[{x1,y1},{x2,y2},{x3,y3}] is the standard form of a triangle,
the coordinates being the vertices of the triangle.";
Begin["‘Private‘"];
545
546 D2DTriangle2D - Description
Description
Representation
Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }] Standard representation of a triangle object in
Descarta2D. The three arguments are the vertex coordinates of the triangle.
Graphics
Provides graphics for a triangle by extending the Mathematica Display command. Executed
when the package is loaded.
SetDisplay2D[
Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],
Line[{{x1,y1},{x2,y2},{x3,y3},{x1,y1}}] ];
Validation
Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }] Detects that the arguments of a triangle are
imaginary and returns the $Failed symbol. If the imaginary parts are insignificant, they are
removed.
Triangle2D::imaginary=
"An invalid triangle of the form ’Triangle2D[‘1‘, ‘2‘, ‘3‘]’ has been
detected; the arguments cannot be imaginary.";
Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}] :=
(Triangle2D @@
ChopImaginary2D[Triangle$2D[p1,p2,p3]]) /;
(FreeQ[{p1,p2,p3},_Pattern] && IsTinyImaginary2D[{p1,p2,p3}]);
Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}] :=
(Message[Triangle2D::imaginary,p1,p2,p3];$Failed) /;
(FreeQ[{p1,p2,p3},_Pattern] && IsComplex2D[{p1,p2,p3},0]);
Triangle2D[{x1, y1 }, {x2 , y2 }, {x3 , y3 }] Detects that the vertex points of a triangle are
collinear and returns the $Failed symbol.
Triangle2D::invalid=
"An invalid triangle of the form ’Triangle2D[‘1‘, ‘2‘, ‘3‘]’ has
detected; the vertex points cannot be collinear.";
Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}] :=
(Message[Triangle2D::invalid,{x1,y1},{x2,y2},{x3,y3}];$Failed) /;
(FreeQ[{p1,p2,p3},_Pattern] &&
IsCollinear2D[Point2D[p1],Point2D[p2],Point2D[p3]]);
Queries
Configuration Query and Check
The private function IsValidConfiguration$2D[{{s1, s2 , s3 }, {a1 , a2 , a3 }}] checks the va-
lidity of a complete triangle configuration and returns True if it is valid; otherwise, returns
False.
IsValidConfiguration$2D[{
S:{s1_?IsScalar2D,s2_?IsScalar2D,s3_?IsScalar2D},
A:{a1_?IsScalar2D,a2_?IsScalar2D,a3_?IsScalar2D}}]:=True /;
Not[IsZeroOrNegative2D[{s1,s2,s3,a1,a2,a3}]] &&
(IsZero2D[s1*Sin[a2]-s2*Sin[a1]] ||
Not[IsReal2D[s1*Sin[a2]-s2*Sin[a1]]]) &&
(IsZero2D[s2*Sin[a3]-s3*Sin[a2]] ||
Not[IsReal2D[s2*Sin[a3]-s3*Sin[a2]]]) &&
(IsZero2D[s1*Sin[a3]-s3*Sin[a1]] ||
Not[IsReal2D[s1*Sin[a3]-s3*Sin[a1]]]) &&
(IsZero2D[Pi-(a1+a2+a3)] ||
Not[IsReal2D[Pi-(a1+a2+a3)]]);
IsValidConfiguration$2D[___]:=False;
CheckConfiguration$2D[{
S:{s1_?IsScalar2D,s2_?IsScalar2D,s3_?IsScalar2D},
A:{a1_?IsScalar2D,a2_?IsScalar2D,a3_?IsScalar2D}}]:={S,A} /;
IsValidConfiguration$2D[{S,A}];
CheckConfiguration$2D[___]:=
(Message[SolveTriangle2D::invConfig];$Failed);
Vertex Query
The private function IsVertex$2D[n] returns True if n is a valid triangle vertex number (1,
2 or 3); otherwise, returns False.
IsVertex$2D[n_] := (n==1 || n==2 || n==3);
Scalars
Angle
Angle2D[triangle, n] Computes the angle at a vertex of a triangle.
548 D2DTriangle2D - Scalars
Angle2D[Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}],n_] :=
Angle2D[Triangle2D[p2,p3,p1],n-1] /;
(n==2 || n==3);
Angle2D[Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}],n_] :=
Module[{a,b,c},
a=Distance2D[p1,p2];
b=Distance2D[p1,p3];
c=Distance2D[p2,p3];
ArcCos[(a^2+b^2-c^2)/(2*a*b)] ] /;
(n==1);
Solve Triangle
SolveTriangle2D[{{s1, s2 , s3 }, {a1 , a2 , a3 }}, True | False] Completely solves a triangle
given a partial configuration of side lengths and angles and returns the complete configuration
of sides and angles. Three of the six configuration parameters are expected, and the others
should be set to Null. If more than three configuration parameters are specified, then they
must be consistent. The second argument, when set to True, returns an alternate configuration
if two solutions exist; if omitted, it defaults to False. The global variable is used at lower
levels to resolve ambiguous cases. The private function SolveTriangle$2D must be called
three times to compute up to three missing configuration parameters.
D2D$SolveTriangle2D$AlternateSolution=False;
SolveTriangle2D[{
S:{s1_?IsScalar2D | Null,s2_?IsScalar2D | Null,s3_?IsScalar2D | Null},
A:{a1_?IsScalar2D | Null,a2_?IsScalar2D | Null,a3_?IsScalar2D | Null}},
alternateSolution_:False]:=
(D2D$SolveTriangle2D$AlternateSolution=alternateSolution;
CheckConfiguration$2D[Nest[SolveTriangle$2D,{S,A},3]]) /;
MemberQ[{True,False},alternateSolution];
SolveTriangle2D[{
S:{s1_?IsScalar2D | Null,s2_?IsScalar2D | Null,s3_?IsScalar2D | Null},
A:{a1_?IsScalar2D | Null,a2_?IsScalar2D | Null,a3_?IsScalar2D | Null}},
alternateSolution_:False]:=
(Message[SolveTriangle2D::constrain];$Failed) /;
(Count[A,Null]>1 && Count[Join[S,A],Null]>3) &&
MemberQ[{True,False},alternateSolution];
Three sides are known (SSS), but not all the angles. Compute the missing angles directly.
SolveTriangle$2D[{S:{s1_?IsScalar2D,s2_?IsScalar2D,s3_?IsScalar2D},
A:{a1_,a2_,a3_} /; Count[A,Null]>0}]:=
{S,{If[a1===Null,ArcCos[(-s1^2+s2^2+s3^2)/(2*s2*s3)],a1],
If[a2===Null,ArcCos[( s1^2-s2^2+s3^2)/(2*s1*s3)],a2],
If[a3===Null,ArcCos[( s1^2+s2^2-s3^2)/(2*s1*s2)],a3]}};
Three angles are known (AAA) but no sides. Compute all the sides directly. Since this case is
under-constrained, we use the added constraint that the perimeter is set equal to 1 and issue
a warning message.
SolveTriangle2D::anglesOnly=
"The triangle configuration is under-constrained; a valid configuration
with the triangle’s perimeter arbitrarily set to 1 will be computed.";
SolveTriangle$2D[{S:{Null,Null,Null},
A:{a1_?IsScalar2D,a2_?IsScalar2D,a3_?IsScalar2D}}]:=
Module[{SA},
SA={{Sin[a1],Sin[a2],Sin[a3]}/(Sin[a1]+Sin[a2]+Sin[a3]),A};
If[IsValidTriangleQ$2D[SA],Message[SolveTriangle2D::anglesOnly]];
SA];
Three angles are known and at least one side. Compute the missing side(s) using the Law of
Sines.
SolveTriangle$2D[{S:{___,_?IsScalar2D,___} /; Count[S,Null]>0,
A:{a1_?IsScalar2D,a2_?IsScalar2D,a3_?IsScalar2D}}]:=
Module[{n=1,sides=S},
While[S[[n]]===Null,n++];
Map[(If[S[[#]]===Null,sides[[#]]=S[[n]]*Sin[A[[#]]]/Sin[A[[n]]]])&,
{1,2,3}];
{sides,A} ];
Two sides and the included angle are known (SAS). Compute the third side using the Law of
Cosines.
SolveTriangle$2D[
{S:{s1_?IsScalar2D,Null,s3_?IsScalar2D},A:{a1_,a2_?IsScalar2D,a3_}} |
{S:{Null,s3_?IsScalar2D,s1_?IsScalar2D},A:{a2_?IsScalar2D,a3_,a1_}} |
{S:{s3_?IsScalar2D,s1_?IsScalar2D,Null},A:{a3_,a1_,a2_?IsScalar2D}} ]:=
{S /. Null->Sqrt[s1^2+s3^2-2*s1*s3*Cos[a2]],A};
Two sides and one angle (not the included angle) are known (SSA-CCW).
SolveTriangle$2D[
{S:{s1_?IsScalar2D,s2_?IsScalar2D,Null},A:{a1_?IsScalar2D,Null,Null}} |
{S:{s2_?IsScalar2D,Null,s1_?IsScalar2D},A:{Null,Null,a1_?IsScalar2D}} |
{S:{Null,s1_?IsScalar2D,s2_?IsScalar2D},A:{Null,a1_?IsScalar2D,Null}}
]:=
{S /. Null->SolveTriangle$SSA$2D[{s1,s2,a1}],A};
550 D2DTriangle2D - Transformations
One angle (not the included angle) and two sides are known (SSA-CW).
SolveTriangle$2D[
{S:{s1_?IsScalar2D,Null,s3_?IsScalar2D},A:{a1_?IsScalar2D,Null,Null}} |
{S:{Null,s3_?IsScalar2D,s1_?IsScalar2D},A:{Null,Null,a1_?IsScalar2D}} |
{S:{s3_?IsScalar2D,s1_?IsScalar2D,Null},A:{Null,a1_?IsScalar2D,Null}}
]:=
{S /. Null->SolveTriangle$SSA$2D[{s1,s3,a1}],A};
Special function for solving SSA cases. Returns the length of the third side of the configuration,
or Null if the configuration is invalid.
SolveTriangle2D::ambiguous=
"Two valid solutions exist for this configuration; set the alternate
solution option to ’‘1‘’ to compute the other configuration.";
SolveTriangle$SSA$2D[{s1_,s2_,a1_}]:=
Module[{a2,a2alt,a3,a3alt,s3,s3alt,normValid,altValid},
a2=ArcSin[s2*Sin[a1]/s1]; a2alt=Pi-a2;
a3=Pi-(a1+a2); a3alt=Pi-(a1+a2alt);
s3=Sqrt[s1^2+s2^2-2*s1*s2*Cos[a3]];
s3alt=Sqrt[s1^2+s2^2-2*s1*s2*Cos[a3alt]];
normValid=IsValidConfiguration$2D[{{s1,s2,s3},{a1,a2,a3}}];
altValid=IsValidConfiguration$2D[{{s1,s2,s3alt},{a1,a2alt,a3alt}}];
If[normValid && altValid && Not[IsZero2D[s3-s3alt]],
Message[SolveTriangle2D::ambiguous,
Not[D2D$SolveTriangle2D$AlternateSolution]]];
Switch[{normValid,altValid,D2D$SolveTriangle2D$AlternateSolution},
{True ,True ,True }, s3alt,
{True ,True ,False}, s3,
{True ,False,True }, s3,
{True ,False,False}, s3,
{False,True, True }, s3alt,
{False,True, False}, s3alt,
{False,False,True }, Null,
{False,False,False}, Null]];
Transformations
Reflect
Reflect2D[triangle, line] Reflects a triangle in a line.
Reflect2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],
L2:Line2D[A2_,B2_,C2_]] :=
Triangle2D[Reflect2D[{x1,y1},L2],
Reflect2D[{x2,y2},L2],
Reflect2D[{x3,y3},L2]];
D2DTriangle2D - Point Construction 551
Rotate
Rotate2D[triangle, θ, coords] Rotates a triangle by an angle θ about a position spec-
ified by a coordinate list. If the third argument is omitted, it defaults to the origin (see
D2DTransform2D.nb).
Rotate2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],theta_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Triangle2D[Rotate2D[{x1,y1},theta,{h,k}],
Rotate2D[{x2,y2},theta,{h,k}],
Rotate2D[{x3,y3},theta,{h,k}]];
Scale
Scale2D[triangle, s, coords] Scales a triangle from a position given by coordinates. If the
third argument is omitted, it defaults to the origin (see D2DTransform2D.nb).
Scale2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],s_?IsScalar2D,
{h_?IsScalar2D,k_?IsScalar2D}] :=
Triangle2D[Scale2D[{x1,y1},s,{h,k}],
Scale2D[{x2,y2},s,{h,k}],
Scale2D[{x3,y3},s,{h,k}]] /;
Not[IsZeroOrNegative2D[s]];
Translate
Translate2D[triangle, {u, v}] Translates a triangle delta distance.
Translate2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],
{u_?IsScalar2D,v_?IsScalar2D}] :=
Triangle2D[{x1+u,y1+v},{x2+u,y2+v},{x3+u,y3+v}];
Point Construction
Centroid
Point2D[triangle, Centroid2D] Constructs the centroid point of a triangle. The centroid
is the intersection of the medians of the triangle (the lines connecting the vertices to the
midpoints of the sides).
Point2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],Centroid2D] :=
Point2D[{x1+x2+x3,y1+y2+y3}/3];
552 D2DTriangle2D - Line Segment Construction
Point2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],Circumscribed2D] :=
Point2D[Circle2D[Point2D[{x1,y1}],Point2D[{x2,y2}],Point2D[{x3,y3}]]];
Point2D[T1:Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],Inscribed2D] :=
Point2D[Circle2D[T1,Inscribed2D]];
Vertex Point
Point2D[triangle, n] Constructs a vertex point of a triangle. The vertex points are
numbered from 1 to 3.
Point2D[T1:Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],n_?IsVertex$2D] :=
Point2D[T1[[n]]];
Line Construction
Side of a Triangle
Line2D[triangle, n1 , n2 ] Constructs the line associated with vertices n1 and n2 of a
triangle.
Line2D[T:Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],
n1_?IsVertex$2D,
n2_?IsVertex$2D] :=
Line2D[T[[n1]],T[[n2]]] /;
(n1!=n2);
Segment2D[T:Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],
n1_?IsVertex$2D,
n2_?IsVertex$2D] :=
Segment2D[T[[n1]],T[[n2]]] /;
(n1!=n2);
Circle Construction
Circumscribed Circle
Circle2D[triangle, Circumscribed2D] Constructs a circle that circumscribes a triangle.
Circle2D[Triangle2D[{x1_,y1_},{x2_,y2_},{x3_,y3_}],Circumscribed2D] :=
Circle2D[Point2D[{x1,y1}],Point2D[{x2,y2}],Point2D[{x3,y3}]];
Inscribed Circle
Circle2D[triangle, Inscribed2D] Constructs a circle inscribed in a triangle.
Circle2D[Triangle2D[p1:{x1_,y1_},p2:{x2_,y2_},p3:{x3_,y3_}],Inscribed2D] :=
Module[{s1,s2,s3,s,r,h,k},
s1=Distance2D[p2,p3];
s2=Distance2D[p1,p3];
s3=Distance2D[p1,p2];
s=(s1+s2+s3)/2;
r=Sqrt[(s-s1)*(s-s2)*(s-s3)/s];
{h,k}=(s1*{x1,y1}+s2*{x2,y2}+s3*{x3,y3})/(2*s);
Circle2D[{h,k},r] ];
Triangle Construction
Triangle from Three Points
Triangle2D[point, point, point] Constructs a triangle from three vertex points.
Triangle2D[Point2D[{x1_,y1_}],Point2D[{x2_,y2_}],Point2D[{x3_,y3_}]] :=
Triangle2D[{x1,y1},{x2,y2},{x3,y3}];
Triangle2D::noTriangle=
"Two of the lines ‘1‘ are parallel, or the three are concurrent; no
triangle exists.";
554 D2DTriangle2D - Epilogue
Triangle2D[L1:Line2D[a1_,b1_,c1_],
L2:Line2D[a2_,b2_,c2_],
L3:Line2D[a3_,b3_,c3_]] :=
If[IsParallel2D[{L1,L2,L3}] || IsConcurrent2D[L1,L2,L3],
Message[Triangle2D::noTriangle,{L1,L2,L3}];$Failed,
Triangle2D[Point2D[L1,L2],Point2D[L1,L3],Point2D[L2,L3]] ];
Triangle2D[{
S:{s1_?IsScalar2D | Null,s2_?IsScalar2D | Null,s3_?IsScalar2D | Null},
A:{a1_?IsScalar2D | Null,a2_?IsScalar2D | Null,a3_?IsScalar2D | Null}},
alternateSolution_:False]:=
Module[{SA,S1,S2,S3,A1,A2,A3,f1,f2,a,b,d},
SA=SolveTriangle2D[{S,A},alternateSolution];
If[SA===$Failed,$Failed,
{{S1,S2,S3},{A1,A2,A3}}=SA;
f1=-S1^2+S2^2+S3^2;
f2=-(S1-S2-S3)(S1+S2-S3)(S1-S2+S3)(S1+S2+S3);
Triangle2D[{0,0},{d,0},{a,b}] /.
{a->f1/(2*S3),b->Sqrt[f2/S3^2]/2,d->S3}] ] /;
MemberQ[{True,False},alternateSolution];
Epilogue
End[ ]; (* end of "‘Private" *)
EndPackage[ ]; (* end of "D2DTriangle2D‘" *)
Part VIII
Explorations
apollon.nb
Circle of Apollonius
Exploration
Show that the locus of a point P (x, y) that moves so that the ratio of its distance from two
fixed points P1 (x1 , y1 ) and P2 (x2 , y2 ) is a circle with radius
dk
r=q
2
(k 2 − 1)
and center
−x1 + k 2 x2 −y1 + k 2 y2
,
k2 − 1 k2 − 1
where d = |P1 P2 |. The locus is called the Circle of Apollonius for the points P1 and P2 and
the ratio k.
Approach
Form the equation of the locus directly from the conditions. Show that the locus is the circle
described.
Solution
Construct the points.
557
558 apollon.nb
In[3]: Clear@kD
eq1 = k ^ 2 ∗ d2 ^ 2 − d1 ^ 2 êê Expand
Construct the circle from its equation. The numerator under the radical is dk.
−x1 + k2 x2 −y1 + k2 y2 dk
Out[5] Circle2DA9 , =,
è!!!!!!!!!!!!!!!!!!!! E
2 −1 + k −1 + k
2
H−1 + k2L2
Discussion
This is a plot of a numerical example with P1 (1, 1), P2 (−1, −2) and k = 1.5.
0
-2
-4
-6
-8
-6 -4 -2 0
arccent.nb
Approach
Construct representative geometry for the semicircular arc. Using symbolic computations,
compute the width of a horizontal rectangle spanning the arc having infinitesimal height. Use
integration to find moments of inertia on each side of the centroid. Equate the moments of
inertia on each side of the centroid and solve for the y-coordinate of the centroid.
Solution
Construct a semicircular arc of radius r (the portion of the circle above the x-axis).
In[1]: Clear@rD;
C1 = Circle2D@80, 0<, rD;
In[2]: Clear@yD;
L1 = Line2D@Point2D@0, yD, 0D;
Compute the intersection points of the horizontal line with the arc.
559
560 arccent.nb
è!!!!!!!!!!!!! è!!!!!!!!!!!!
!
Out[3] 9Point2DA9 r2 − y2 , y=E, Point2DA9− r2 − y2 , y=E=
The width of the arc is the difference between the abscissas of the intersection points.
In[4]: L = XCoordinate2D@First@ptsDD − XCoordinate2D@Last@ptsDD
è!!!!!!!!!!!!
!
Out[4] 2 r2 − y2
By integrating Ld find the moment of inertia of an area, where d is the distance from the
centroid line (y = y). I1 is the expression for the moment of inertia of the upper area with
respect to y.
In[5]: Clear@yBD;
int1 = Integrate@L ∗ HyB − yL, yD êê Simplify
1 è!!!!!!!!!!!!
! y
Out[5] r2 − y2 H2 r2 + y H−2 y + 3 yBLL + r2 yB ArcTanA
è!!!!!!!!!!!! ! E
3 r2 − y2
The next few steps show the output computed by Mathematica Version 3.0.1. Version 4.0
produces slightly different results that are algebraically equivalent. The final step is the same
in both versions.
In[6]: I1 = Hint1 ê. y −> yBL − Hint1 ê. y −> 0L ê. Hr ^ 2L ^ H3 ê 2L −> r ^ 3
2 r3 1 è!!!!!!!!!!!!!!! yB
Out[6] − + r2 − yB2 H2 r2 + yB2L + r2 yB ArcTanA
è!!!!!!!!!!!!!!! E
3 3 r2 − yB2
I2 is the expression for the moment of inertia of the upper area with respect to y.
In[7]: int2 = Integrate@L ∗ Hy − yBL, yD êê Simplify
1 è!!!!!!!!!!!!
! y
Out[7] − r2 − y2 H2 r2 + y H−2 y + 3 yBLL − r2 yB ArcTanA
è!!!!!!!!!!!! ! E
3 r2 − y2
1 1 è!!!!!!!!!!!!!!! yB
Out[8] − π r2 yB + r2 − yB2 H2 r2 + yB2L + r2 yB ArcTanA
è!!!!!!!!!!!!!!! E
2 3 r2 − yB2
The moments of inertia must be the same on each side of the centroid line.
In[9]: eq1 = I2 − I1 == 0
2 r3 1
Out[9] − π r2 yB == 0
3 2
Solve for y.
In[10]: Solve@eq1, yBD
4r
Out[10] 99yB → ==
3π
arcentry.nb
Exploration
Let P0 and P1 be the start and end points of an arc, respectively, and P be a third point on
the vector tangent to the arc at P0 . Show that
s = |(P − P0 ) × (P1 − P0 )|
c = (P − P0 ) · (P1 − P0 )
represent values of s and c useful for computing the bulge factor of the arc.
Approach
Use the trigonometric definition of a cross-product to justify the value for s. Use the trigono-
metric definition of a dot product to justify the value for c.
Solution
The cross-product definition in two dimensions is A × B = |A||B| sin(α) where α is the angle
between vectors A and B. Therefore, |(P − P0 ) × (P1 − P0 )| is equal to |P P 0 ||P P 1 | sin(α)
which is a scalar multiple of sin(α). The dot product trigonometric definition in two di-
mensions is A · B = |A||B| cos(α) where α is the angle between vectors A and B. Therefore,
(P − P0 ) · (P1 − P0 ) is equal to |P P 0 ||P P 1 | cos(α) which is the same scalar multiple of cos(α).
Therefore, s and c are multiples of the sine and cosine of the angle between the chord and the
entry angle as required.
561
562 arcentry.nb
Discussion
Example: Construct and sketch the arc with start point (3, 0) and end point (0, 0) with an
entry angle vector through the point (4, 1). First define functions for the two-dimensional
cross-product and magnitude.
In[1]: Cross2D@8u1_, v1_<, 8u2_, v2_<D := Cross@8u1, v1, 0<, 8u2, v2, 0<D;
Compute the bulge factor using s and c. The bulge factor is given by
s
B= √ .
c + c2 + s2
In[3]: P0 = Point2D@p0 = 83, 0<D;
P1 = Point2D@p1 = 80, 0<D;
P = Point2D@p = 84, 1<D;
s = Magnitude2D@Cross2D@p − p0, p1 − p0DD;
c = Dot@p − p0, p1 − p0D;
B = s ê Hc + Sqrt@c ^ 2 + s ^ 2DL
3
Out[3]
è!!!
−3 + 3 2
3.5
3
2.5
2
1.5
1
0.5
0
0 1 2 3 4
arcexit.nb
Exploration
Let P0 and P1 be the start and end points, respectively, of an arc and P be a third point on
the vector tangent to the arc at P1 . Show that
s = |(P1 − P0 ) × (P − P1 )|
c = (P1 − P0 ) · (P − P1 )
represent values of s and c useful for computing the bulge factor of the arc.
Approach
Use the trigonometric definition of a cross-product to justify the value for s. Use the trigono-
metric definition of a dot product to justify the value for c.
Solution
Let Q be the point of intersection of the tangents at end points P0 and P1 . The entry angle
QP0 P1 = α is equal to the angle QP1 P0 because triangle 4QP0 P1 is an isosceles triangle.
The cross-product definition in two dimensions is given by A × B = |A||B| sin(α) where α
is the angle between vectors A and B. Therefore, the expression |(P1 − P0 ) × (P − P1 )| is
|P0 P1 ||P P1 | sin(α) which is a scalar multiple of sin(α). The dot product trigonometric defini-
tion in two dimensions is given by A · B = |A||B| cos(α) where α is the angle between vectors
A and B. (P1 − P0 ) · (P − P1 ) is |P0 P1 ||P P1 | cos(α) and, therefore, is the same scalar multiple
of cos(α). Therefore, s and c are multiples of the sine and cosine of the angle between the
chord and the entry angle as required.
563
564 arcexit.nb
Discussion
Example: Construct and sketch the arc with end points (3, 0) and (0, 0) with an exit angle
vector through the point (1, −1). First define functions for the two-dimensional cross-product
and magnitude.
In[1]: Cross2D@8u1_, v1_<, 8u2_, v2_<D := Cross@8u1, v1, 0<, 8u2, v2, 0<D;
Compute the bulge factor using s and c. The bulge factor is given by
s
B= √ .
c + c2 + s2
In[3]: P0 = Point2D@p0 = 83, 0<D;
P1 = Point2D@p1 = 80, 0<D;
P = Point2D@p = 81, −1<D;
s = Magnitude2D@Cross2D@p1 − p0, p − p1DD;
c = Dot@p1 − p0, p − p1D;
B = s ê Hc + Sqrt@c ^ 2 + s ^ 2DL
3
Out[3]
è!!!
−3 + 3 2
3
2
1
0
-1
0 1 2 3
archimed.nb
Archimedes’ Circles
Exploration
C¢
C¢¢
r3
r1
r2
x
Draw the vertical tangent line at the intersection point of the two smaller tangent circles, c1
and c2 , in an arbelos (shoemaker’s knife, see figure). Prove that the two circles C 0 and C 00
tangent to this line, the large semicircle, c3 , and c1 and c2 , are congruent (have equal radii).
These circles are known as Archimedes’ Circles.
Approach
Position the arbelos from the origin using circles whose radii are r1 , r2 and r3 = 2 (r1 + r2 ) (see
definitions, below). Compute the tangent circles as described in the exploration statement.
Compare the radii of these circles to show they are equal.
Solution
Construct the arbelos circles and the tangent line.
565
566 archimed.nb
In[2]: Off@Solve2D::infiniteD;
t1 = TangentCircles2D@8c1, c3, l12<D;
t2 = TangentCircles2D@8c2, c3, l12<D;
On@Solve2D::infiniteD;
Compare the radii. Since negative radii are invalid, the radius of the Archimedes’ Circle is
given by R = r1 r2 / (r1 + r2 ). One pair is above the x-axis, the other pair is below.
r1 r2 r1 r2 r1 r2 r1 r2
Out[3] 99−r1, −r2, r2, − , , − , =,
r1 + r2 r1 + r2 r1 + r2 r1 + r2
r1 r2 r1 r2 r1 r2 r1 r2
9−r1, r1, −r2, − , , − , ==
r1 + r2 r1 + r2 r1 + r2 r1 + r2
arcmidpt.nb
Midpoint of an Arc
Exploration
P
P1
P0
Show that the midpoint, P , of a bulge factor arc between points P0 and P1 whose bulge factor
is B has coordinates
(x0 + x1 ) − B(y0 − y1 ) (y0 + y1 ) + B(x0 − x1 )
P , .
2 2
Approach
Construct the perpendicular bisector of the arc’s chord. Offset the midpoint of the chord an
appropriate direction and distance to find the arc’s midpoint.
Solution
Create the arc end points.
In[1]: Clear@x0, y0, x1, y1D;
P0 = Point2D@8x0, y0<D;
P1 = Point2D@8x1, y1<D;
567
568 arcmidpt.nb
x0 + x1 y0 + y1 1 y0 + y1
Out[3] Point2DA9 − y0 + , x0 + H−x0 − x1L + =E
2 2 2 2
1 1
Out[4] Point2DA9 Hx0 + x1 + B H−y0 + y1LL, HB Hx0 − x1L + y0 + y1L=E
2 2
The coordinates of the point at the parameter t = 1/2 produce the same result.
In[5]: Arc2D@8x0, y0<, 8x1, y1<, BD@1 ê 2D êê FullSimplify
1 1
Out[5] 9 Hx0 + x1 + B H−y0 + y1LL, HB Hx0 − x1L + y0 + y1L=
2 2
Discussion
Example: Construct the midpoint of the bulge factor arc with end points (4, 0) and (0, 4) and
bulge factor B = 2. First, define a function for computing the midpoint.
In[6]: ArcMidPoint2D@P0 : Point2D@8x0_, y0_<D,
P1 : Point2D@8x1_, y1_<D,
B_ ? IsScalar2DD :=
Point2D@HHx0 + x1L − B Hy0 − y1LL ê 2, HHy0 + y1L + B Hx0 − x1LL ê 2D;
7
6
5
4
3
2
1
0
0 1 2 3 4 5 6 7
caarclen.nb
Approach
Create the conic arc. Compute the arc length using the standard formula. Show that the
result is a function of a and b only.
Solution
Create the conic arc.
In[2]: Clear@tD;
8xt, yt< = ca1@tD êê Simplify
569
570 caarclen.nb
Integrate to find the arc length. The resulting function involves elementary functions of a
and b only. The result shown here was computed by Mathematica Version 3.0.1. Version 4.0
produces a different result that is algebraically equivalent and involves elementary functions
of a and b only.
Approach
Construct the conic arc in the given position and use integration to find the area.
Solution
Construct the conic arc.
In[1]: Clear@a, b, d, pD;
ca1 = ConicArc2D@80, 0<, 8a, b<, 8d, 0<, pD;
In[2]: Clear@tD;
8X1, Y1< = ca1@tD êê FullSimplify
571
572 caarea1.nb
Out[3] 4 a2 p2 y2 + a p2 y H4 b d − 8 b x − 4 d yL ==
4 b2 d p2 x − 4 b2 p2 x2 − 4 b d p2 x y − d2 y2 + 2 d2 p y2 − d2 p2 y2
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
b d p + 2 a p y − d Ip y + Hb p − yL Hb p + y − 2 p yL M
Out[4] 99x → =,
2bp
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
b d p + 2 a p y + d I−p y + Hb p − yL Hb p + y − 2 p yL M
9x → ==
2bp
The length, L, of an area element in terms of y is the difference between the two x locations
on the curve.
In[5]: L = Hx ê. ans@@2, 1DDL − Hx ê. ans@@1, 1DDL êê FullSimplify
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
d Hb p − yL Hb p + y − 2 p yL
Out[5]
bp
The area between the curve and the x-axis is the integral of L evaluated between the limits
on the y-axis. The curve is smooth, so we ignore the convergence warning by turning the
warning message off. The result shown in this step was computed using Mathematica Version
3.0.1. Version 4.0 produces a slightly different result that is algebraically equivalent.
In[6]: Off@Integrate::generD;
Clear@E1, E2, rD;
A1 = Integrate@L, 8y, 0, b ∗ p<D êê FullSimplify
è!!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!!!!!
j I H−1 + pL −b H−1 + pL p −b H−1 + pL p LogA E
i 2 I b H−1+pL p
j i
2 2
1 è!!!!!!!!!!!
Out[6] j
jdj
j
1−2 p
+
è!!!!!!!!!!!!! j j
j j è!!!!!!
1 − 2 p H−2 + 4 pL bp
k k
! iè!!!!!!!!!!!!! i y zy
yz
è!!!!!!!!!
b2 p2 j
Ip
j1 −
j 1 − 2 p p + I H−1 + pL2 LogA2 b p j z y
zzz
è!!!!!!!!!!!!! zEzz zz
z
k k 1 − 2 p { {zz
{{
The area under the curve is the same as the area given by the formula.
In[8]: IsZero2D@A1 − A2D
Out[8] True
caarea2.nb
bd
A=
3
when the control points are (0, 0), (a, b) and (d, 0).
Approach
Place the conic arc in the position given and use integration to find the area.
Solution
Create the conic arc.
In[2]: Clear@tD;
ans = Solve@ca1@tD@@2DD == y, tD êê Simplify
è!!!!!!!!!!!!! è!!!!!!!!!!!!!
1 b−2y 1 ij b−2y y z
è!!! =, 9t → j1 +
Out[2] 99t → − è!!! z==
2 2 b 2 k b {
573
574 caarea2.nb
è!!! è!!!!!!!!!!!!!
bd− b d b−2y +2ay−dy
Out[3]
2b
è!!! è!!!!!!!!!!!!!
bd+ b d b−2y +2ay−dy
Out[4]
2b
In[5]: L = X2 − X1 êê Simplify
è!!!!!!!!!!!!!
d b−2y
Out[5]
è!!!
b
Find the area by integration (ρ = 1/2, so the limits of integration are 0 to b/2).
bd
Out[6]
3
cacenter.nb
Exploration
Show that the center (H, K) of a conic arc whose control points are P0 (x0 , y0 ), PA (xA , yA )
and P1 (x1 , y1 ) and whose projective discriminant is ρ is
−ρ2 xA + (ρ − 1)2 xM
H=
1 − 2ρ
2
−ρ2 yA + (ρ − 1) yM
K=
1 − 2ρ
where PM (xM , yM ) is the midpoint of the conic arc’s chord and has coordinates
x0 y0 + y1
xM = 2 and yM = .
x1 2
Approach
Form the quadratic equation of a conic arc and convert it to a quadratic. Find the center
point of the quadratic and simplify.
Solution
Determines the quadratic equation of a conic arc. The following steps were computed us-
ing Mathematica Version 3.0.1. Version 4.0 produces different results that are algebraically
equivalent. Both versions produce the same final step.
575
576 cacenter.nb
1
2 H−k HF + x0 y − x1 y − x y0 + xA y0 + x y1 − xA y1 − x0 yA + x1 yAL +
Out[1] 2
F
HxA Hy − y1L + x Hy1 − yAL + x1 H−y + yALL HxA H−y + y0L + x0 Hy − yAL + x H−y0 + yALLL
Multiply through by F 2 .
Out[2] −k HF + x0 y − x1 y − x y0 + xA y0 + x y1 − xA y1 − x0 yA + x1 yAL2 +
HxA Hy − y1L + x Hy1 − yAL + x1 H−y + yALL HxA H−y + y0L + x0 Hy − yAL + x H−y0 + yALL
Out[3] Point2DA
2 F k Hx0 + x1 − 2 xAL + H−1 + 4 kL xA H−xA y0 − x0 y1 + xA y1 + x1 Hy0 − yAL + x0 yAL
9 ,
H−1 + 4 kL Hx1 y0 − xA y0 − x0 y1 + xA y1 + x0 yA − x1 yAL
2 F k Hy0 + y1 − 2 yAL + H−1 + 4 kL yA H−xA y0 − x0 y1 + xA y1 + x1 Hy0 − yAL + x0 yAL
=E
H−1 + 4 kL Hx1 y0 − xA y0 − x0 y1 + xA y1 + x0 yA − x1 yAL
Simplify.
In[4]: Clear@pD;
c2 = c1 ê.
8F −> Hy0 − yAL Hx1 − xAL − Hx0 − xAL Hy1 − yAL,
k −> H1 − pL ^ 2 ê H4 p ^ 2L,
x0 + x1 −> 2 ∗ xM,
y0 + y1 −> 2 ∗ yM< êê FullSimplify
Change the signs on the numerator and denominator to get the desired formulas.
Approach
Create the conic arc and find the quadratic associated with it. Force the quadratic’s coefficients
to represent a circle and solve for ρ.
Solution
Create the conic arc.
In[1]: Clear@a, b, pD;
ca1 = ConicArc2D@80, 0<, 8a, b<, 82 a, 0<, pD;
In[2]: Q1 = Quadratic2D@ca1D;
In[3]: 8a1, b1, c1, d1, e1, f1< = Map@Together, List @@ Q1D
1 −1 + 2 p 1 1
Out[3] 9−
2 , 0,
2 2 , , − , 0=
4a 4b p 2a 2b
577
578 cacircle.nb
è!!!!!!!!!!!!
! è!!!!!!!!!!!!
!
a Ia + a2 + b2 M a I−a + a2 + b2 M
Out[4] 99p → −
2 =, 9p →
2 ==
b b
è!!!!!!!!!!!!
!
a I−a + a2 + b2 M
Out[5] p →
2
b
Discussion
A numerical example with a = 6 and b = 40.
4
3
2
1
0
0 2 4 6 8 10 12
camedian.nb
Approach
Construct the geometry and compare the coordinates of P to the shoulder point coordinates.
Solution
Create the conic arc control points.
In[1]: Clear@x0, y0, xA, yA, x1, y1D;
p0 = Point2D@P0 = 8x0, y0<D;
pA = Point2D@PA = 8xA, yA<D;
p1 = Point2D@P1 = 8x1, y1<D;
x0 + x1 y0 + y1
Out[2] Point2DA9 , =E
2 2
Construct the point on the median. This result was computed using Mathematica Version
3.0.1. Version 4.0 computes a slightly different result that is algebraically equivalent. Both
versions verify that the points are coincident in the final step.
579
580 camedian.nb
In[3]: Clear@pD;
P = Point2D@pM, pA, p ∗ Distance2D@pM, pADD êê Simplify
1 1
Out[3] Point2DA9 Hx0 − p x0 + x1 − p x1 + 2 p xAL, Hy0 − p y0 + y1 − p y1 + 2 p yAL=E
2 2
1 1
Out[4] Point2DA9 Hx0 − p x0 + x1 − p x1 + 2 p xAL, Hy0 − p y0 + y1 − p y1 + 2 p yAL=E
2 2
Out[5] True
Discussion
This is a plot of a numerical example.
6
5
4
3
2
1
0
0 1 2 3 4 5 6
caparam.nb
Approach
Create the unit conic arc. Eliminate t from the parametric equations and construct a quadratic
from the result. Construct a quadratic directly from the conic arc. Verify that the two
quadratics are identical.
Solution
Create the unit conic arc.
In[1]: Clear@a, b, pD;
ca1 = ConicArc2D@80, 0<, 8a, b<, 81, 0<, pD;
581
582 caparam.nb
Out[5] True
carlyle.nb
Carlyle Circle
Exploration
Given a circle, C1 , passing through the three points (0, 1), (0, −p) and (s, −p), show that the
x-coordinates of the intersection points P1 (x1 , 0) and P2 (x2 , 0) of C1 with the x-axis are the
roots of the quadratic equation x2 − sx − p = 0.
Approach
Construct the circle through three points and intersect it with the x-axis. Solve the quadratic
equation directly and show that the roots are equal to the x-coordinates of the intersection
points.
Solution
Construct the circle through three points.
In[1]: Clear@p, sD;
C1 = Circle2D@
p1 = Point2D@80, 1<D,
p2 = Point2D@80, −p<D,
p3 = Point2D@8s, −p<DD êê FullSimplify
s 1−p 1 "#######################
Out[1] Circle2DA9 , =, H1 + pL2 + s2 E
2 2 2
1 è!!!!!!!!!!!!!!2 1 è!!!!!!!!!!!!!!
Out[2] 9Point2DA9 Is − 4 p + s M, 0=E, Point2DA9 Is + 4 p + s2 M, 0=E=
2 2
Solve the quadratic directly which produces the same roots as the x-axis intersections.
583
584 carlyle.nb
In[3]: Clear@xD;
Solve@x ^ 2 − s ∗ x − p == 0, xD
1 è!!!!!!!!!!!!!!2 1 è!!!!!!!!!!!!!!
Out[3] 99x → Is − 4 p + s M=, 9x → Is + 4 p + s2 M==
2 2
Discussion
This is a plot of a numerical example with p = 2 and s = 4.
2
1
0
-1
-2
-3
0 1 2 3 4
The intersection points on the x-axis are the same as the roots of the equation.
In[5]: NSolve@x ^ 2 − 4 ∗ x − 2 == 0, xD
Castillon’s Problem
Exploration
Let P1 , P2 and P3 be three points inside the circle C1 ≡ x2 + y 2 = 1. Describe a method for
inscribing a triangle inside C1 such that the sides of the triangle pass through the three given
points.
Approach
Let V1 , V2 and V3 be the vertex points of the inscribed triangle. Using the rational parametric
equations of the circle, express the coordinates of the vertex points in terms of parameters t1 ,
t2 and t3 . Form three equations in three unknowns, t1 , t2 and t3 , using the condition that
each of the given points must lie on a line containing one side of the triangle. Solve the three
equations for the parameter values of the vertex points.
Solution
This is a function that returns the rational parameterization of a unit circle at the origin given
a parameter value, t.
In[1]: RationalParameterization2D@t_D :=
8H1 − t ^ 2L ê H1 + t ^ 2L, 2 t ê H1 + t ^ 2L<;
1 − t12 2 t1 1 − t22 2 t2
Out[2] 9Point2DA9
2 ,
2 =E, Point2DA9
2 ,
2 =E,
1 + t1 1 + t1 1 + t2 1 + t2
1 − t32 2 t3
Point2DA9 , =E=
1 + t32 1 + t32
585
586 castill.nb
Form three equations by forcing the points P1 , P2 and P3 to be on the lines containing the
sides of the triangle.
Solve the equations for the parameter values. The resulting expressions are complicated and
uninteresting, so we suppress them and use them in the graphical illustrations below. Notice
that in general there are two solutions to the problem.
Out[5] 2
Discussion
Example 1: Plot the solutions for the points P1 (0.25, 0.25), P2 (0.5, −0.5) and P3 (−0.5, −0.5).
1
0.5
0
-0.5
-1
-1-0.5 0 0.5 1
Example 2: Plot the solutions for the points P1 (0.5, 0.5), P2 (−0.5, 0.5) and P3 (0, −0.5).
1
0.5
0
-0.5
-1
-1-0.5 0 0.5 1
catnln.nb
Approach
Create the conic arc and construct a point at t = 1/2. Construct the quadratic underlying
the conic arc. Construct the polar of P with respect to the quadratic (the tangent, L). Show
that L is horizontal and, therefore, parallel to the conic arc’s chord.
Solution
Create the conic arc.
In[1]: Clear@a, b, pD;
ca1 = ConicArc2D@80, 0<, 8a, b<, 81, 0<, pD;
1 1
Out[2] Point2DA9 + J− + aN p, b p=E
2 2
589
590 catnln.nb
Out[4] Line2D@0, 1, −b pD
Discussion
Plot a numerical example with a = 1, b = 2 and ρ = 0.45.
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.2 0 0.2 0.4 0.6 0.8 1 1.2
center.nb
Center of a Quadratic
Exploration
Show that applying the change in variables
2cd − be 2ae − bd
x = x0 + 2
and y = y 0 + 2
b − 4ac b − 4ac
to the quadratic equation ax2 + bxy + cy 2 + dx + ey + f = 0 causes the linear terms to vanish,
implying that the center of the conic is
2cd − be 2ae − bd
h= 2
, k= 2 .
b − 4ac b − 4ac
Approach
Directly apply the change in variables to the equation and simplify the resulting quadratic.
Solution
Apply the specified change in variables.
In[1]: Clear@a, b, c, d, e, f, x, yD;
eq1 = a ∗ x ^ 2 + b ∗ x ∗ y + c ∗ y ^ 2 + d ∗ x + e ∗ y + f ê.
8x −> x + H2 c ∗ d − b ∗ eL ê Hb ^ 2 − 4 a ∗ cL,
y −> y + H2 a ∗ e − b ∗ dL ê Hb ^ 2 − 4 a ∗ cL<
2cd−be 2cd−be 2
−b d + 2 a e
+ xN + a J
Out[1] f + d J + xN + e J + yN +
2 b −4ac 2 b −4ac 2 b −4ac
2cd−be −b d + 2 a e −b d + 2 a e 2
+ xN J
b J + yN + c J + yN
b2 − 4 a c b2 − 4 a c b2 − 4 a c
Simplify the quadratic and notice that the linear terms have vanished. This result was com-
puted using Mathematica Version 3.0.1. Version 4.0 produces a slightly different result for the
constant term that is algebraically equivalent to the one shown here.
591
592 center.nb
c d2 + e H−b d + a eL
Out[2] Quadratic2DAa, b, c, 0, 0,
+ fE
2 b −4ac
Discussion
Notice that the coefficients a, b and c are unaffected by this change in variables.
chdlen.nb
Exploration
r1 r2
d
C1 C2
Show that the distance, d, between the intersection points of two circles is given by
p
− (D − r1 − r2 ) (D + r1 − r2 ) (D − r1 + r2 ) (D + r1 + r2 )
d=
D
where D is the distance between the centers of the circles, and r1 and r2 are the radii of the
two circles.
Approach
Assume the radii of the two circles centered at C1 and C2 are r1 and r2 , respectively, P1 is
one of the intersection points, and the distance between the centers is D. The length of the
common chord, d, can be found by equating the area (squared) of 4C 1 C2 P1 using Heron’s
formula and the standard area formula A = bh/2.
593
594 chdlen.nb
Solution
A1 is the area (squared) by Heron’s formula.
1
Out[1] − HD1 − r1 − r2L HD1 + r1 − r2L HD1 − r1 + r2L HD1 + r1 + r2L
16
A2 is the area (squared) by the standard area formula A = bh/2 (d is the distance between
the intersection points, i.e. the length of the chord).
In[2]: Clear@dD;
A2 = HD1 ∗ Hd ê 2L ê 2L ^ 2 êê Simplify
d2 D12
Out[2]
16
Set the areas equal and solve for d. Take the positive value. This result was computed
√ using
Mathematica Version 3.0.1. Version 4.0 produces a different result involving −1 that is
algebraically equivalent.
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
−HD1 − r1 − r2L HD1 + r1 − r2L HD1 − r1 + r2L HD1 + r1 + r2L
Out[3] 99d → − =,
D1
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
−HD1 − r1 − r2L HD1 + r1 − r2L HD1 − r1 + r2L HD1 + r1 + r2L
9d → ==
D1
Discussion
If the radii are equal the result can be significantly simplified. This result was √
computed
using Mathematica Version 3.0.1. Version 4.0 produces a different result involving −1 that
is algebraically equivalent.
In[4]: Clear@rD;
ans2 = Last@ansD êê. 8r1 −> r, r2 −> r< êê FullSimplify;
ans2 êê. Sqrt@−D1 ^ 4 + 4 D1 ^ 2 r ^ 2D −> D1 ∗ Sqrt@−D1 ^ 2 + 4 r ^ 2D
"####################
#
Out[4] 9d → −D12 + 4 r2 =
cir3pts.nb
Approach
Find the quadratic (circle) through the three points, then convert it to an equation.
Solution
Construct the quadratic.
In[1]: Clear@a, bD;
Q = Quadratic2D@Point2D@0, 0D, Point2D@a, 0D, Point2D@0, bDD
Out[2] −a x + x2 − b y + y2 == 0
595
circarea.nb
π θ − sin θ
= .
3 2
Also, show that θ is within 1/2 percent of 5π/6 radians.
Approach
Create an expression for the area, A1 , of a segment in terms of a generic angular span, θ1 .
Create an expression for the area of a full circle, A2 . Solve the equation A1 = A2 /3 for θ1 .
Solution
Find the area of a circle’s segment.
1
Out[1] r2 Ht1 − Sin@t1DL
2
Out[2] π r2
597
598 circarea.nb
In[3]: eq1 = A1 − A2 ê 3 == 0
π r2 1
Out[3] − + r2 Ht1 − Sin@t1DL == 0
3 2
π 1
Out[4] − + Ht1 − Sin@t1DL == 0
3 2
Discussion
Solve the equation A1 = A2 /3 for θ1 .
5
Out[6]
6
Exploration
P0
r1 x
C1
Show that the locus of midpoints from a fixed point P0 to a circle C1 of radius r1 , is a circle
of radius r1 /2. Furthermore, show that the center point of the locus is the midpoint of the
segment between P0 and the center of C1 .
Approach
Without loss of generality, choose the point P0 to be the origin and the circle C1 to have
center (h1 , 0). Construct the locus of midpoints and examine its form.
Solution
Construct the circle and the locus of points.
599
600 cirptmid.nb
1 1
Out[1] Point2DA9 Hh1 + r1 Cos@tDL, r1 Sin@tD=E
2 2
This locus is clearly a circle of radius r1 /2 centered at (h1 /2, 0), which is the midpoint of the
line segment from the point to the circle’s center.
Discussion
Here’s a function that computes the midpoint circle in the special position.
The first plot is a numerical example with the origin outside the circle (r1 = 1), while the
second plot’s origin is inside the circle (r1 = 3).
1
0.5
0
-0.5
-1
0 0.5 1 1.5 2 2.5 3
3
2
1
0
-1
-2
-3
-1 0 1 2 3 4 5
cramer2.nb
Approach
Use the Mathematica Det command to compute the appropriate determinants and then sub-
stitute the solutions back into the original equations to demonstrate that they solve the equa-
tions.
Solution
Compute the necessary determinants.
In[1]: Clear@a1, b1, c1, a2, b2, c2D;
dx = Det@88−c1, b1<, 8−c2, b2<<D;
dy = Det@88a1, −c1<, 8a2, −c2<<D;
dD = Det@88a1, b1<, 8a2, b2<<D;
601
602 cramer2.nb
−b2 c1 + b1 c2 a2 c1 − a1 c2
Out[2] 9 , =
−a2 b1 + a1 b2 −a2 b1 + a1 b2
Discussion
The Solve command produces the same result in Mathematica Version 3.0.1. Version 4.0
computes a slightly different result that is algebraically equivalent.
In[4]: Solve@8a1 ∗ x + b1 ∗ y + c1 == 0,
a2 ∗ x + b2 ∗ y + c2 == 0<, 8x, y<D êê Simplify
−b2 c1 + b1 c2 a2 c1 − a1 c2
Out[4] 99x → , y → ==
−a2 b1 + a1 b2 −a2 b1 + a1 b2
cramer3.nb
a1 x + b1 y + c1 z + d1 = 0
a2 x + b2 y + c2 z + d2 = 0
a3 x + b3 y + c3 z + d3 = 0
is given by
−d1 b1 c1 a1 −d1 c1 a1 b1 −d1
−d2 b2 c2 a2 −d2 c2 a2 b2 −d2
−d3 b3 c3 a3 −d3 c3 a3 b3 −d3
x= ,y= and z =
D D D
where
a1 b1 c1
D = a2 b2 c2 .
a3 b3 c3
Approach
Use the Mathematica Det command to compute the appropriate determinants and then sub-
stitute the solutions back into the original equations to demonstrate that they solve the equa-
tions.
Solution
Compute the necessary determinants.
603
604 cramer3.nb
In[1]: Clear@a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3D;
dx = Det@88−d1, b1, c1<, 8−d2, b2, c2<, 8−d3, b3, c3<<D;
dy = Det@88a1, −d1, c1<, 8a2, −d2, c2<, 8a3, −d3, c3<<D;
dz = Det@88a1, b1, −d1<, 8a2, b2, −d2<, 8a3, b3, −d3<<D;
dD = Det@88a1, b1, c1<, 8a2, b2, c2<, 8a3, b3, c3<<D;
b3 c2 d1 − b2 c3 d1 − b3 c1 d2 + b1 c3 d2 + b2 c1 d3 − b1 c2 d3
Out[2] 9 ,
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
−a3 c2 d1 + a2 c3 d1 + a3 c1 d2 − a1 c3 d2 − a2 c1 d3 + a1 c2 d3
,
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
a3 b2 d1 − a2 b3 d1 − a3 b1 d2 + a1 b3 d2 + a2 b1 d3 − a1 b2 d3
=
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
Discussion
The Solve command produces the same result in Mathematica Version 3.0.1. Version 4.0
computes a slightly different expression that is algebraically equivalent.
In[4]: Clear@zD;
Simplify@
Solve@8a1 ∗ x + b1 ∗ y + c1 ∗ z + d1 == 0,
a2 ∗ x + b2 ∗ y + c2 ∗ z + d2 == 0,
a3 ∗ x + b3 ∗ y + c3 ∗ z + d3 == 0<, 8x, y, z<D
D
b3 c2 d1 − b2 c3 d1 − b3 c1 d2 + b1 c3 d2 + b2 c1 d3 − b1 c2 d3
Out[4] 99x → ,
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
−a3 c2 d1 + a2 c3 d1 + a3 c1 d2 − a1 c3 d2 − a2 c1 d3 + a1 c2 d3
y → ,
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
a3 b2 d1 − a2 b3 d1 − a3 b1 d2 + a1 b3 d2 + a2 b1 d3 − a1 b2 d3
z → ==
−a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
deter.nb
Determinants
Exploration
Determinants often provide a concise notation for expressing relationships in analytic geome-
try. Show that the expanded algebraic form for the 2 × 2 determinant
a1 b 1
a2 b 2
is given by −a2 b1 + a1 b2 .
Show that the expanded algebraic form for the 3 × 3 determinant
a1 b1 c1
a2 b2 c2
a 3 b 3 c3
is given by −a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3 .
Approach
Use the Mathematica Det command to compute the desired determinants.
Solution
The Det command produces the desired results directly.
Out[1] −a2 b1 + a1 b2
605
606 deter.nb
In[2]: Clear@a1, b1, c1, a2, b2, c2, a3, b3, c3D;
Det@88a1, b1, c1<, 8a2, b2, c2<, 8a3, b3, c3<<D
Out[2] −a3 b2 c1 + a2 b3 c1 + a3 b1 c2 − a1 b3 c2 − a2 b1 c3 + a1 b2 c3
elfocdir.nb
Approach
Construct the directrix and the pole of the focus and verify that they are the same lines.
Solution
Construct the required geometry.
a2 a2
Out[1] 9Line2DA1, 0, −
è!!!!!!!!!!!!! E, Line2DA1, 0,
è!!!!!!!!!!!!! E=
a2 − b2 a2 − b2
è!!!!!!!!!!!!! è!!!!!!!!!!!!
!
Out[2] 9Line2DA a2 − b2 , 0, −a2E, Line2DA− a2 − b2 , 0, −a2E=
607
608 elfocdir.nb
Discussion
This is a plot of a numerical example with a = 1.5 and b = 1.
1.5
1
0.5
0
-0.5
-1
-1.5
-2 -1 0 1 2
elimlin.nb
2 2 d2 e2
ax0 + cy 0 − − +f =0
4a 4c
whose linear terms have vanished.
Approach
Apply the transformation rules directly to the quadratic equation.
Solution
Apply the transformation rules to the equation.
d2 e2
Out[1] − − + f + a x2 + c y2
4a 4c
609
elimxy1.nb
Approach
Create a quadratic and rotate it by an angle θ. Show that the coefficient of the xy term is
zero.
Solution
Create a quadratic.
In[1]: Clear@a, b, c, d, e, fD;
Q = Quadratic2D@a, b, c, d, e, fD;
Out[3] 0
611
elimxy2.nb
Exploration
Show that applying the change in variables x0 = kx + y and y 0 = ky − x, where
s
2
(c − a) c−a
k= + + 1,
b b
to the equation ax2 + bxy + cy 2 + dx + ey + f = 0 will cause the xy term to vanish and a new
quadratic with the following coefficients will be formed:
a0 = ak 2 − bk + c
b0 = 0
c0 = ck 2 + bk + a
d0 = dk − e
e0 = ek + d
f 0 = f.
Approach
Create a quadratic and form a quadratic equation. Apply the change in variables and examine
the coefficients.
613
614 elimxy2.nb
Solution
Create a quadratic.
Out[4] 0
elimxy3.nb
1
tan θ =
k
and scaling the quadratic by a scale factor
1
s= √ .
1 + k2
Approach
Create a quadratic and rotate and scale it as specified. Compare the result to the result of
elimxy2.nb.
Solution
Create a quadratic.
615
616 elimxy3.nb
Rotate it by the specified angle. The results shown in the next few steps were computed using
Mathematica Version 3.0.1. Version 4.0 produces similar results except the coefficients are
multiplied by a constant. Both versions produce the same result in the final step.
In[2]: Clear@kD;
Q2 = Rotate2D@Q1, ArcTan@1 ê kDD êê Simplify
1 1
1 + k H−e + d kL, $%%%%%%%%%%%%%
$%%%%%%%%%%%%% 1 + k Hd + e kL, f H1 + k2LE
k2 k2
In[3]: Q2@@2DD = 0; Q2
1
Out[3] Quadratic2DAc + k H−b + a kL, 0, a + k Hb + c kL, $%%%%%%%%%%%%%
1 +
2 k H−e + d kL,
k
1
1 + k Hd + e kL, f H1 + k2LE
$%%%%%%%%%%%%%
k2
Scale as specified.
1 è!!!!!!!!!!! 1 è!!!!!!!!!!!
1 + k H−e + d kL 1 + k2 , $%%%%%%%%%%%%%
$%%%%%%%%%%%%% 1 +
k Hd + e kL 1 + k2 , f H1 + k2LE
k2 k2
Approach
Compute the distances from a generic point (x, y) to the lines and show that the equation
must be an ellipse.
Solution
Create the two lines and a generic point.
In[1]: Clear@A1, B1, C1, A2, B2, C2, x, yD;
l1 = Line2D@A1, B1, C1D;
l2 = Line2D@A2, B2, C2D;
pt = Point2D@x, yD;
Form the quadratic equation (without loss of generality, assume the lines are normalized).
In[3]: Q1 = Quadratic2D@eq1, 8x, y<D ê.
8A1 ^ 2 + B1 ^ 2 −> 1, A2 ^ 2 + B2 ^ 2 −> 1<
617
618 elldist.nb
The discriminant of the quadratic, B 2 − 4AC, is negative; therefore, the curve is an ellipse.
2
Note that the expression (A2 B1 − A1 B2 ) cannot be zero if the lines intersect.
Discussion
This is a plot of a numerical example using three different values of K.
1.5
1
0.5
0
-0.5
-2 -1 0 1 2
ellfd.nb
Approach
Apply the definition of an ellipse to the supplied focus and directrix for a general point (x, y)
and show that the derived locus is an ellipse.
Solution
The rotation angle of the ellipse is the angle the line perpendicular to L makes with the
+x-axis (in Mathematica ArcTan[p, q] is ArcTan[q/p], the first form takes into account the
quadrant of the point (p, q)).
In[1]: Clear@p, q, rD;
L = Line2D@p, q, rD;
theta = Angle2D@Line2D@0, 1, 0D, Line2D@Point2D@0, 0D, LDD;
theta êê Simplify
q
Out[1] ArcTanA E
p
619
620 ellfd.nb
Now we must show that the lengths a and b are given by the formulas. In standard position
the distance from the focus of an ellipse to its directrix is given by d = a/e − ae. Solving
for a gives the following result in Mathematica Version 3.0.1. Version 4.0 produces a slightly
different result that is algebraically equivalent.
de
Out[2] 99a →
2 == 1−e
p
Also, the eccentricity is given by e = a2 − b2 /a and solving for b gives (take the positive
result).
è!!!!!!!!!!!2 è!!!!!!!!!!!
Out[3] 99b → −a 1 − e =, 9b → a 1 − e2 ==
The eccentricity is the ratio of the distance from a general point to the focus to the distance
to the directrix.
"###################################### Hr + p x + q yL2
Out[4] 9 Hx − x1L2 + Hy − y1L2 , $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
=
p2 + q2
1
2 He r + 2 e p r x − p x + e p x − q x + 2 p x x1 + 2 q x x1 − p x1 − q x1 +
Out[5] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 p +q
2 e2 q r y + 2 e2 p q x y − p2 y2 − q2 y2 + e2 q2 y2 + 2 p2 y y1 + 2 q2 y y1 − p2 y12 − q2 y12L
In[7]: Clear@D1D;
8h2, k2< = 8x1 + p ∗ a ∗ e ∗ D1 ê d, y1 + q ∗ a ∗ e ∗ D1 ê d< êê.
8a −> d ∗ e ê H1 − e ^ 2L,
b −> a ∗ Sqrt@1 − e ^ 2D,
d −> Sqrt@Hp ∗ x1 + q ∗ y1 + rL ^ 2 ê Hp ^ 2 + q ^ 2LD,
D1 −> Hp ∗ x1 + q ∗ y1 + rL ê Hp ^ 2 + q ^ 2L<
e2 p Hr + p x1 + q y1L e2 q Hr + p x1 + q y1L
, y1 +
Out[7] 9x1 + =
H1 − e L Hp + q L
2 2 2 H1 − e L Hp + q L
2 2 2
This shows that the center indeed has the same coordinates as the point from the formula.
In[8]: 8h1 − h2, k1 − k2< êê Simplify
Discussion
An example showing the construction of an ellipse from its focus, directrix and eccentricity.
In[9]: focus1 = Point2D@81 ê 2, 1<D;
directrix1 = Line2D@5, 8, −20D;
eccentricity1 = 3 ê 4;
ellipse1 = Ellipse2D@focus1, directrix1, eccentricity1D
116 61 114 57 8
Out[9] Ellipse2DA9− , − =,
è!!!!! ,
è!!!!!!!! , ArcTanA EE
623 623 7 89 2 623 5
3
2
1
0
-1
-1 0 1 2 3
ellips2a.nb
Approach
Construct a generic point on an ellipse. Construct the two foci of the ellipse. Find the distance
from each focus to the generic point. Show that the sum of the distances is 2a.
Solution
Create the ellipse and a generic point on it.
In[1]: Clear@a, b, tD;
e1 = Ellipse2D@80, 0<, a, b, 0D;
p1 = Point2D@e1@tDD
è!!!!!!!!!!!!! è!!!!!!!!!!!!
!
Out[2] 9Point2DA9 a2 − b2 , 0=E, Point2DA9− a2 − b2 , 0=E=
Find the sum of the distances from the generic point to the foci.
In[3]: sum1 = Distance2D@p1, f1D + Distance2D@p1, f2D
è!!!!!!!!!!!!! 2 è!!!!!!!!!!!!! 2
I− a2 − b2 + a Cos@tDM + b2 Sin@tD2 + $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Out[3] $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% I a2 − b2 + a Cos@tDM + b2 Sin@tD2
623
624 ellips2a.nb
Replace the expressions under the radicals with the equivalent perfect square expressions.
è!!!!!!!!!!!!! 2 è!!!!!!!!!!!!! 2
Ia − a2 − b2 Cos@tDM + $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Out[6] $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ia + a2 − b2 Cos@tDM
Since a > b > 0, both expressions are clearly the square root of a squared positive number,
which simply reduces to the positive number itself.
In[7]: Clear@E1D;
sum2 ê. Sqrt@E1_ ^ 2D −> E1
Out[7] 2 a
elllen.nb
Approach
Construct an ellipse in standard position. Construct a line perpendicular to the axis of the
ellipse through one of the focal points (the line containing the focal chord). Compute the
distance between the points of intersection of the ellipse and the line.
Solution
Create the ellipse.
In[1]: Clear@a1, b1D;
e1 = Ellipse2D@80, 0<, a1, b1, 0D;
"#################
Out[2] Point2DA9 a12 − b12 , 0=E
"#################
Out[3] Line2DA1, 0, − a12 − b12 E
625
626 elllen.nb
The length of the focal chord is the distance between the intersection points.
b14
Out[5] 2 $%%%%%%%%%
2
a1
Notice that since a > 0 and b > 0 the solution reduces to 2b2 /a.
2 b12
Out[6]
a1
ellrad.nb
Approach
Create a standard ellipse centered at the origin and create an expression representing the
distance from a focus point to a point on the ellipse (in terms of the eccentricity and semi-
major axis). Find the parameter value on the ellipse where the distance is a minimum or a
maximum.
Solution
p p
The eccentricity is given by e = a2 − b2 /a; therefore, a2 − b2 = ea. Find the focus points
and use this substitution.
In[1]: Clear@a, b, eD;
e1 = Ellipse2D@80, 0<, a, b, 0D;
fpts1 = Foci2D@e1D ê. Sqrt@a ^ 2 − b ^ 2D −> a ∗ e
627
628 ellrad.nb
è!!!!!!!!!!!2 è!!!!!!!!!!!
Out[3] 99b → −a 1 − e =, 9b → a 1 − e2 ==
"#####################################
Out[4] a2 H−1 + e Cos@tDL2
The maximum value of d occurs when cos(θ) = −1, or θ = π; the minimum value of d occurs
when cos(θ) = 1, or θ = 0.
In[5]: 8apoapsis, periapsis< = Map@Hd ê. #L&, 8Cos@tD −> −1, Cos@tD −> 1<D
"######################
# "#######################
Out[5] 9 a2 H−1 − eL2 , a2 H−1 + eL2 =
In[6]: Clear@E1D;
8apoapsis, periapsis< ê.
Sqrt@a ^ 2 ∗ E1_ ^ 2D −> a ∗ H−E1L êê Factor
Similar Ellipses
Exploration
All ellipses of equal eccentricity are essentially similar in that by a proper choice of scales
(and axes) they can be made to coincide. Show this property is true for two ellipses of equal
eccentricity centered at the origin.
Approach
Construct two ellipses with equal eccentricity. Show that one can be scaled to coincide with
the other.
Solution
Construct the two ellipses by vertex points.
"#############2
Out[1] 9Ellipse2DA80, 0<, a1, a1 1 − e1 , ArcTan@2 a1, 0DE,
"#############2
Ellipse2DA80, 0<, a2, a2 1 − e1 , ArcTan@2 a2, 0DE=
"#############2
Out[2] Ellipse2DA80, 0<, a2, a2 1 − e1 , ArcTan@2 a1, 0DE
629
630 ellsim.nb
Discussion
This is a plot of a pair of similar ellipses.
1
0.5
0
-0.5
-1
-2 -1 0 1 2
ellslp.nb
Approach
Construct a line with slope m and use the function TangentLines2D[ln, quad] to construct
the desired tangent lines.
Solution
Construct a line with slope m.
Construct the lines tangent to the ellipse and parallel to the line.
è!!!!!!!!!!!!!!!!!
! è!!!!!!!!!!!!!!!!!!
Out[3] 9− b2 + a2 m2 + m x − y == 0, b2 + a2 m2 + m x − y == 0=
631
632 ellslp.nb
Discussion
Plot a numerical example.
3
2
1
0
-1
-2
-3
-4 -2 0 2 4
eqarea.nb
P0 is the centroid of 4ABC and 4P 1 P2 P3 . 4ABC connects the midpoints of the sides of
4P 1 P2 P3 .
Approach
Construct the geometry and solve a system of equations that equates the areas of the three
triangles. Compare the centroid and midpoints as specified.
Solution
Create the points.
633
634 eqarea.nb
Form equations by equating the areas (squared). Squaring is required because the area calcu-
lation may produce a symbolically negative number for the area.
1
Out[3] 9 HxA y − xB y − x yA + xB yA + x yB − xA yBL2 ==
4
1
HxA y − xC y − x yA + xC yA + x yC − xA yCL2,
4
1
HxA y − xC y − x yA + xC yA + x yC − xA yCL2 ==
4
1
HxB y − xC y − x yB + xC yB + x yC − xB yCL2=
4
1 1
Out[5] 9Point2DA9 HxA + xB + xCL, HyA + yB + yCL=E,
3 3
Point2D@8−xA + xB + xC, −yA + yB + yC<D, Point2D@8xA − xB + xC, yA − yB + yC<D,
Point2D@8xA + xB − xC, yA + yB − yC<D=
1 1
Out[6] Point2DA9 HxA + xB + xCL, HyA + yB + yCL=E
3 3
1 1
Out[7] Point2DA9 HxA + xB + xCL, HyA + yB + yCL=E
3 3
Discussion
This is a plot of a numerical example.
In[9]: Sketch2D@8Triangle2D@A1, B1, C1D,
Triangle2D@P1, P2, P3D,
P0, P1, P2, P3< ê.
8xA −> −1, yA −> −1,
xB −> 3, yB −> 0,
xC −> 1, yC −> 3<D;
-2
-4
-2 0 2 4
eyeball.nb
Eyeball Theorem
Exploration
r1 r2
The tangents to each of two circles from the center of the other are drawn as shown in the
figure. Prove that the chords illustrated are equal in length.
Approach
Construct the chords and compare their lengths.
Solution
Without loss of generality, scale the circles so that the distance between the centers is 1.
Position them at the origin and along the positive x-axis.
637
638 eyeball.nb
Discussion
This is a plot of a numerical example.
1
0.75
0.5
0.25
0
-0.25
-0.5
-0.75
0 0.5 1 1.5 2
gergonne.nb
Approach
Create the triangle in a simplified position and construct the inscribed circle. Construct the
tangency points and the prescribed lines. Show that the lines are concurrent.
Solution
Without loss of generality, create the triangle’s vertex points and the triangle itself in a
convenient position.
In[1]: Clear@a, bD;
P1 = Point2D@0, 0D;
P2 = Point2D@a, bD;
P3 = Point2D@1, 0D;
T1 = Triangle2D@P1, P2, P3D;
639
640 gergonne.nb
Construct tangency points which are the poles of the sides with respect to the inscribed circle.
The three lines are concurrent if the determinant of their coefficients is zero.
In[6]: Det@8List @@ L1, List @@ L2, List @@ L3<D êê FullSimplify
Out[6] 0
Discussion
This plots a numerical example with specific points.
In[7]: Sketch2D@8P1, P2, P3, T1, C1, Q12, Q13, Q23, L1, L2, L3,
Point2D@L1, L2D< êê. 8a −> 2 ê 3, b −> 1<,
PlotRange −> 88−0.25, 1.25<, 8−0.25, 1.25<<D;
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.2 0 0.2 0.4 0.6 0.8 1 1.2
heron.nb
Heron’s Formula
Exploration
Show that the area, K, of a 4ABC is given by
p
K = s(s − a) (s − b) (s − c)
where the semi-perimeter s = (a + b + c) /2 and a, b and c are the lengths of the sides.
Approach
In a 4ABC with side lengths a, b and c, derive an expression for cos A (the cosine of the angle
2 2
at vertex A of the triangle) using the Law of Cosines. Using the identity (sin A) = 1 − (cos A)
the area can be computed using K = (1/2) bc sin A. Simplify the resulting expression for the
area, K, to Heron’s formula.
Solution
Find an expression for the cos A using the Law of Cosines.
In[1]: Clear@a, b, c, s, cosA, sinA, E1D;
cA = Solve@a ^ 2 == b ^ 2 + c ^ 2 − 2 ∗ b ∗ c ∗ cosA, cosAD êê Simplify
−a2 + b2 + c2
Out[1] 99cosA → ==
2bc
Find an expression for the sin A using the previous expression for cos A. Use the positive
result.
In[2]: sA = Solve@HsinA ^ 2 + cosA ^ 2 == 1L ê. cA, sinAD êê Last
1 2 a2 2 a2 a4 b2 c2
Out[2] 9sinA → $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 +
2 +
2 −
2 2 − 2 −
2 =
2 b c b c c b
641
642 heron.nb
Compute the area of the triangle from one-half the product of the base and height.
1 H−a + b − cL Ha + b − cL H−a + b + cL Ha + b + cL
Out[3] b c $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
−
2 2
4 b c
Simplify to Heron’s formula. The following steps were computed using Mathematica Version
3.0.1. Version 4.0 produces slightly different results that are algebraically equivalent.
1 H−a + b − cL Ha + b − cL H−a + b + cL Ha + b + cL
Out[4] b c $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
−
2 2
4 b c
1 è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Out[5] −H−a + b − cL Ha + b − cL H−a + b + cL Ha + b + cL
4
In[6]: K4 = K3 êê.
8a + b −> 2 ∗ s − c,
b + c −> 2 ∗ s − a,
−a − c −> −H2 ∗ s − bL< êê FullSimplify
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Out[6] s H−a + sL H−b + sL H−c + sL
hyp2a.nb
Approach
Construct a generic point on a hyperbola. Construct the two foci of the hyperbola. Find the
distance from each focus to the generic point. Show that the difference of the distances is 2a.
Solution
Create the hyperbola and a generic point on it.
In[1]: Clear@a, b, tD;
h1 = Hyperbola2D@80, 0<, a, b, 0D;
p1 = Point2D@a ∗ Cosh@tD, b ∗ Sinh@tDD
è!!!!!!!!!!!!! è!!!!!!!!!!!!
!
Out[2] 9Point2DA9 a2 + b2 , 0=E, Point2DA9− a2 + b2 , 0=E=
Compute the difference of the distances from the generic point to the foci.
In[3]: diff1 = Distance2D@p1, f2D − Distance2D@p1, f1D
è!!!!!!!!!!!!! 2 è!!!!!!!!!!!!! 2
Out[3] − $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I− a2 + b2 + a Cosh@tDM + b2 Sinh@tD2% + $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I a2 + b2 + a Cosh@tDM + b2 Sinh@tD2
643
644 hyp2a.nb
Replace the expressions under the radicals with the equivalent perfect square expressions.
è!!!!!!!!!!!!! 2 è!!!!!!!!!!!!! 2
Out[6] − $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ia − a2 + b2 Cosh@tDM + $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ia + a2 + b2 Cosh@tDM
Since a > 0, b > 0 and cosh(θ) ≥ 1 the expression under the radicals are reduced as follows.
Out[7] 2 a
hyp4pts.nb
Equilateral Hyperbolas
Exploration
Describe a method for finding the equilateral hyperbola(s) passing through four points. Show
that the technique produces the correct results for the points (2, 1), (−1, 1), (−2, −1) and
(4, −3) by plotting the hyperbola(s) and the four points.
Approach
Form a quadratic, parameterized by the variable k, representing the pencil of quadratics
passing through the four points. The first and third coefficients of the quadratic, a and c,
must satisfy the relationship a = −c, if the quadratic represents an equilateral hyperbola.
Solve the equation for k.
Solution
This is a function that implements the approach.
Discussion
Here’s the plot of the solution for the four points specified.
645
646 hyp4pts.nb
-2
Exploration
y
P2
O x
P1
y
P2
O x
P1
Referring to the figures, use calculus to verify that the areas between two parameters t1 and
t2 of a segment and a sector of a hyperbola are given by
647
648 hyparea.nb
ab
Asegment = (sinh(s(t2 − t1 )) − s(t2 − t1 ))
2
abs
Asector = (t2 − t1 )
2
where a and b are the lengths of the semi-transverse and semi-conjugate axes, respectively,
s = cosh−1 (e) and e is the eccentricity of the hyperbola (assuming the parameterization
Descarta2D uses for a hyperbola).
Approach
Find the coordinates of x1 and x2 , the coordinates of the ends of the infinitesimal rectangle.
Integrate (x2 − x1 ) dx from y1 to y2 to find the area of the segment. Find the area of the
4OP1 P2 from its vertex points. Subtract the area of the segment from the area of the triangle
to find the area of the sector.
Solution
The x-coordinate of a point on the hyperbola (found by solving x2 /a2 − y 2 /b2 = 1 for x) in
terms of the y-coordinate.
y2
1 +
2
Out[1] a $%%%%%%%%%%%%%
b
The x-coordinate of a point on a line between (x1 , y1 ) and (x2 , y2 ) . This is found by intersecting
a horizontal line through the point on the hyperbola with the line between P1 and P2 . This
step and the one immediately following show the results computed by Mathematica Version
3.0.1. Version 4.0 produces slightly different results that are algebraically equivalent.
L is the length of the horizontal line segment between the hyperbola and the line through P1
and P2 .
In[3]: L = X2 − X1 êê FullSimplify
Find the area of the hyperbolic segment between the chord and the hyperbola by evaluating
the integral at the vertical limits. Simplify.
1 i
j
j y12 y22
ja y1 1 +
Out[5] j
j $%%%%%%%%%%%%%%%% − Hx1 + x2L Hy1 − y2L − a y2 $%%%%%%%%%%%%%%%
1 +
% +
2 j b2 b2
k
y
z
y1 y2
a b JArcSinhA E − ArcSinhA ENz
z
z
z
b b z
{
In[6]: A2 = A1 êê. 8
a ∗ Sqrt@1 + y1 ^ 2 ê b ^ 2D −> x1,
a ∗ Sqrt@1 + y2 ^ 2 ê b ^ 2D −> x2<
1 y1 y2
Out[6] Jx1 y1 − Hx1 + x2L Hy1 − y2L − x2 y2 + a b JArcSinhA E − ArcSinhA ENN
2 b b
In[8]: Clear@sD;
P = H1@tD ê. ArcCosh@Sqrt@a ^ 2 + b ^ 2D ê aD −> s
Simplify.
1
Out[9] − a b H−ArcSinh@Sinh@s t1DD + ArcSinh@Sinh@s t2DD + Sinh@s Ht1 − t2LDL
2
650 hyparea.nb
In[10]: Clear@E1D;
A4 = A3 ê.
ArcSinh@Sinh@E1_DD −> E1 êê FullSimplify
1
Out[10] − a b Hs H−t1 + t2L + Sinh@s Ht1 − t2LDL
2
In[11]: AreaSegment = A4 ê.
Sinh@s Ht1 − t2LD −> −Sinh@s Ht2 − t1LD
1
Out[11] − a b Hs H−t1 + t2L − Sinh@s H−t1 + t2LDL
2
1
Out[12] − a b Sinh@s Ht1 − t2LD
2
1
Out[13] a b s H−t1 + t2L
2
hypeccen.nb
Approach
Create the hyperbolas, compute their eccentricities and verify the relationship.
Solution
Create a hyperbola and its conjugate.
In[1]: Clear@a, bD;
h1 = Hyperbola2D@80, 0<, a, b, 0D;
h2 = Hyperbola2D@h1, Conjugate2DD;
Out[3] 1
651
hypfd.nb
Approach
Apply the definition of a hyperbola to the supplied focus and directrix for a general point
(x, y) and show that the derived locus is a hyperbola.
Solution
The rotation angle of the hyperbola is the angle the line perpendicular to L makes with the
+x-axis (in Mathematica ArcTan[p, q] is ArcTan[q/p], the first form takes into account the
quadrant of the point (p, q)).
In[1]: Clear@p, q, rD;
L = Line2D@p, q, rD;
theta = Angle2D@Line2D@0, 1, 0D, Line2D@Point2D@0, 0D, LDD;
theta êê Simplify
q
Out[1] ArcTanA E
p
653
654 hypfd.nb
Now we must show that the lengths a and b are given by the formulas. In standard position
the distance from the focus of an ellipse to its directrix is given by d = ae − a/e. Solving for
a gives the following.
de
Out[2] 99a →
2 == −1 + e
p
Also, the eccentricity is given by e = a2 + b2 /a and solving for b gives (take the positive
result).
è!!!!!!!!!!!!!2! è!!!!!!!!!!!!!!
Out[3] 99b → −a −1 + e =, 9b → a −1 + e2 ==
The eccentricity is the ratio of the distance from a general point to the focus to the distance
to the directrix.
"###################################### Hr + p x + q yL2
Out[4] 9 Hx − x1L2 + Hy − y1L2 , $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
=
p2 + q2
1
2 He r + 2 e p r x − p x + e p x − q x + 2 p x x1 + 2 q x x1 − p x1 − q x1 +
Out[5] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 p +q
2 e2 q r y + 2 e2 p q x y − p2 y2 − q2 y2 + e2 q2 y2 + 2 p2 y y1 + 2 q2 y y1 − p2 y12 − q2 y12L
In[7]: Clear@D1D;
8h2, k2< = 8x1 − p ∗ a ∗ e ∗ D1 ê d, y1 − q ∗ a ∗ e ∗ D1 ê d< êê.
8a −> d ∗ e ê He ^ 2 − 1L,
b −> a ∗ Sqrt@e ^ 2 − 1D,
d −> Sqrt@Hp ∗ x1 + q ∗ y1 + rL ^ 2 ê Hp ^ 2 + q ^ 2LD,
D1 −> Hp ∗ x1 + q ∗ y1 + rL ê Hp ^ 2 + q ^ 2L<
e2 p Hr + p x1 + q y1L e2 q Hr + p x1 + q y1L
, y1 −
Out[7] 9x1 − =
H−1 + e L Hp + q L
2 2 2 H−1 + e L Hp + q L
2 2 2
This shows that the center indeed has the same coordinates as the point from the formula.
In[8]: 8h1 − h2, k1 − k2< êê Simplify
Discussion
An example showing the construction of a hyperbola from its focus, directrix and eccentricity.
In[9]: focus1 = Point2D@81 ê 2, 1<D;
directrix1 = Line2D@5, 8, −15D;
eccentricity1 = 5 ê 4;
hyperbola1 = Hyperbola2D@focus1, directrix1, eccentricity1D
107 189 10 15 8
Out[9] Hyperbola2DA9 , =,
è!!!!! ,
è!!!!! , ArcTanA EE
89 89 89 2 89 5
5
4
3
2
1
0
-1
-1 0 1 2 3 4
hypinv.nb
Approach
Construct a generic point on a rectangular hyperbola and compare the appropriate distances.
Solution
Create a generic point on a rectangular hyperbola.
In[1]: Clear@a, tD;
h1 = Hyperbola2D@80, 0<, a, a, 0D;
p1 = Point2D@a ∗ Cosh@tD, a ∗ Sinh@tDD
Out[3] Cosh@2 tD
657
658 hypinv.nb
In[4]: Clear@E1D;
D1 ∗ D2 êê. 8
Sqrt@a ^ 2 ∗ E1_D −> a ∗ Sqrt@E1D,
Sqrt@Cosh@E1_DD ∗ Sqrt@Sech@E1_DD −> 1<
Out[4] a2
Discussion
This is a plot of a numerical example of the geometric objects.
2
1
0
-1
-2
-4 -2 0 2 4
hyplen.nb
Approach
Construct a hyperbola in standard position. Construct a line perpendicular to the axis of the
hyperbola through one of the focal points (the line containing the focal chord). Compute the
distance between the points of intersection of the hyperbola and the line.
Solution
Create the hyperbola.
In[1]: Clear@a1, b1D;
h1 = Hyperbola2D@80, 0<, a1, b1, 0D;
"#################
Out[2] Point2DA9 a12 + b12 , 0=E
"#################
Out[3] Line2DA1, 0, − a12 + b12 E
659
660 hyplen.nb
The length of the focal chord is the distance between the intersection points.
b14
Out[5] 2 $%%%%%%%%%
2
a1
Notice that since a > 0 and b > 0 the solution reduces to 2b2 /a.
2 b12
Out[6]
a1
hypslp.nb
Exploration
the lines tangent to the hyperbola x2 /a2 − y 2 /b2 = 1 with slope m are given by
Show thatp
y = mx ± a2 m2 − b2 .
Approach
Construct a line with slope m and use TangentLines2D[ln, quad] to construct the desired
tangent lines.
Solution
Construct a line with slope m.
Construct the lines tangent to the hyperbola and parallel to the line.
è!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!
Out[3] 9− −b2 + a2 m2 + m x − y == 0, −b2 + a2 m2 + m x − y == 0=
661
662 hypslp.nb
Discussion
This is a plot of a numerical example.
2
1
0
-1
-2
-6 -4 -2 0 2 4 6
hyptrig.nb
x = a sec(θ)
y = b tan(θ)
x2 y2
− = 1.
a2 b2
Approach
Demonstrate that the parametric equations satisfy the equation of the hyperbola.
Solution
Substitute the parametric values into the equation and observe that the equation is satisfied.
Out[1] 0
663
intrsct.nb
Exploration
Show that the point of intersection of the lines
x y x y
+ = 1 and + =1
a b b a
is
ab ab
, .
(a + b) (a + b)
Approach
Create the two lines and intersect them.
Solution
Create the two lines.
ab ab
Out[2] Point2DA9 , =E
a+b a+b
665
666 intrsct.nb
Discussion
Notice that the formula cannot be used if a = ±b, because in both cases the two lines are
coincident. This limitation is more obvious if we do not simplify the equation for the point of
intersection (the denominators are zero when a = ±b).
−a2 b + a b2 −a2 b + a b2
Out[3] Point2DA9
2 ,
2 =E
2 −a + b −a + b
2
inverse.nb
Inversion
Exploration
A point P 0 (x0 , y 0 ) is said to be the inverse of a point P (x, y) in the circle
2 2
C ≡ (x − h) + (y − k) = r2
if points O(h, k), P and P 0 are collinear and |OP ||OP 0 | = r2 . Using this definition show that
A. The coordinates of P 0 (x0 , y 0 )) are
r2 (x − h) r2 (y − k)
x0 = h + and y 0
= k + .
(x − h)2 + (y − k)2 (x − h)2 + (y − k)2
667
668 inverse.nb
Approach
See the commentary below.
Solution
Use the definition of inversion to find the coordinates of a point (x, y) inverted in the circle
2 2
(x − h) + (y − k) = r2 . This is the solution to proposition A as stated above.
r2 H−h + xL r2 H−k + yL
Out[1] 9h +
2 , k +
2 =
H−h + xL + H−k + yL
2
H−h + xL + H−k + yL
2
x y
Out[3] 9
2 ,
2 =
2 x +y 2 x +y
Determine the inverse inversion equations. This is the solution to proposition B as stated
above.
In[4]: Clear@x1, y1D;
eqn1 = Solve@8x1, y1< == invPts, 8x, y<D
x1 y1
Out[4] 99x →
2 , y →
2 ==
2
x1 + y1 2
x1 + y1
inverse.nb 669
A1 x1 B1 y1
Out[5] C1 +
2 +
2
x1 + y1 2
x1 + y1 2
Determine the quadratic (a circle). This is the solution to proposition C as stated above.
In[7]: Circle2D@Quadratic2D@eq2, 8x1, y1<DD
A1 B1 1 A12 + B12
Out[7] Circle2DA9− , − =, $%%%%%%%%%%%%%%%%%%%
2 E
2 C1 2 C1 2 C1
A1 x1 B1 y1
2 +
Out[8]
2
x1 + y1 x1 + y1
2 2
Out[9] A1 x1 + B1 y1
The line inverts into itself. This is the solution to proposition D as stated above.
In[10]: Line2D@eq4, 8x1, y1<D
Inversion of a circle.
In[11]: Clear@h1, k1, r1D;
eq5 = Hx − h1L ^ 2 + Hy − k1L ^ 2 − r1 ^ 2 ê. First@eqn1D
2 2
i x1 y i y1 y
Out[11] −r12 + j−h1 + z + j−k1 + z
2
k 2
x1 + y1 { 2
k x1 + y1 {
2
Out[12] −1 + 2 h1 x1 − h12 x12 − k12 x12 + r12 x12 + 2 k1 y1 − h12 y12 − k12 y12 + r12 y12
670 inverse.nb
Find the circle. If the resulting denominators are zero, then the circle passes through the
center of inversion and the inversion is invalid. This is the solution to proposition E as stated
above.
In[13]: Circle2D@Quadratic2D@eq7, 8x1, y1<DD êê Simplify
h1 k1 r12
Out[13] Circle2DA9
2 ,
2 =, $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2% E
2 2
h1 + k1 − r1 2
h1 + k1 − r1
2
Hh12 + k12 − r12L
1 − 2 h1 x1 − 2 k1 y1
Out[14]
x1 + y1
2 2
Clear the denominator and find the line. This is the solution to the first part of proposition
F as stated above.
In[15]: eq9 = Numerator@eq8D;
Line2D@eq9, 8x1, y1<D
The line is parallel to the tangent at the origin. This is the solution to the second part of
proposition F as stated above.
Exploration
Take any three circles C1 , C2 and C3 which pass through the origin, have equal radii, r, and
intersect in pairs in two distinct points (one of the points is, by construction, the origin).
Prove that the circle passing through the other three points of intersection between the circles
taken in pairs is congruent to the original three circles (that is, this circle has a radius of r).
Approach
Find the coordinates of the intersection points, P1 , P2 and P3 . Use the circle through three
points function to find Johnson’s Circle. Show that the radius of this circle is r.
Solution
Without loss of generality, assume the circles have a radius of one and one of them has its
center at (1, 0). The centers of the other two circles can be written as functions of the angles
the lines through (0, 0) and the centers makes with the +x axis.
671
672 johnson.nb
Intersect the first and second circle to find the intersection points. The head ImPoint2D is
introduced to avoid failures during simplification when the coordinates of the points pass
through a temporary phase involving complex numbers.
In[3]: pts12 = Points2D@C1, C2D;
pts12 = Map@FullSimplify, Map@HImPoint2D @@ #L&, pts12DD;
pts12 = Map@HPoint2D @@ #L&, pts12D
1 t2 "##################2 1 "##################
Out[3] 9Point2DA9 CotA E JSin@t2D − Sin@t2D N, JSin@t2D − Sin@t2D2 N=E,
2 2 2
1 t2 "##################2 1 "##################
Point2DA9 CotA E JSin@t2D + Sin@t2D N, JSin@t2D + Sin@t2D2 N=E=
2 2 2
Intersect the first and third circle to find the intersection points.
In[4]: pts13 = Points2D@C1, C3D;
pts13 = Map@FullSimplify, Map@HImPoint2D @@ #L&, pts13DD;
pts13 = Map@HPoint2D @@ #L&, pts13D
1 t3 "##################2 1 "##################
Out[4] 9Point2DA9 CotA E JSin@t3D − Sin@t3D N, JSin@t3D − Sin@t3D2 N=E,
2 2 2
1 t3 "##################2 1 "##################
Point2DA9 CotA E JSin@t3D + Sin@t3D N, JSin@t3D + Sin@t3D2 N=E=
2 2 2
Intersect the second and third circle to find the intersection points.
In[5]: pts23 = Points2D@C2, C3D;
pts23 = Map@FullSimplify, Map@HImPoint2D @@ #L&, pts23DD;
pts23 = Map@HPoint2D @@ #L&, pts23D
1 t2 + t3 t2 − t3 "##########################2#
Out[5] 9Point2DA9 CosA E CscA E JSin@t2 − t3D + Sin@t2 − t3D N,
2 2 2
1 t2 − t3 "########################### t2 + t3
CscA E JSin@t2 − t3D + Sin@t2 − t3D2 N SinA E=E,
2 2 2
1 t2 + t3 t2 − t3 "###########################
Point2DA9− CosA E CscA E J−Sin@t2 − t3D + Sin@t2 − t3D2 N,
2 2 2
1 t2 − t3 "########################### t2 + t3
− CscA E J−Sin@t2 − t3D + Sin@t2 − t3D2 N SinA E=E=
2 2 2
One of the intersection points must be the origin. Which one depends on whether the expres-
sion under the radical is positive or negative. We introduce the sign variables s1 , s2 and s3
which may only take values of ±1 to cover all the cases.
In[6]: Clear@s2, s3, s23D;
pts12 = pts12 êê. Sqrt@Sin@t2D ^ 2D −> s2 ∗ Sin@t2D;
pts13 = pts13 êê. Sqrt@Sin@t3D ^ 2D −> s3 ∗ Sin@t3D;
pts23 = pts23 êê. Sqrt@Sin@t2 − t3D ^ 2D −> s23 ∗ Sin@t2 − t3D;
Each pair of intersection points must include the origin as one point. Notice that the other
point has the same coordinates no matter which sign is used.
In[7]: pts12 = Map@Hpts12 ê. s2 −> #L&, 8−1, 1<D
t2
Out[7] 99Point2DA9CotA E Sin@t2D, Sin@t2D=E, Point2D@80, 0<D=,
2
t2
9Point2D@80, 0<D, Point2DA9CotA E Sin@t2D, Sin@t2D=E==
2
johnson.nb 673
t3
Out[8] 99Point2DA9CotA E Sin@t3D, Sin@t3D=E, Point2D@80, 0<D=,
2
t3
9Point2D@80, 0<D, Point2DA9CotA E Sin@t3D, Sin@t3D=E==
2
t2 + t3 t2 − t3
Out[9] 99Point2D@80, 0<D, Point2DA9CosA E CscA E Sin@t2 − t3D,
2 2
t2 − t3 t2 + t3
CscA E Sin@t2 − t3D SinA E=E=,
2 2
t2 + t3 t2 − t3
9Point2DA9CosA E CscA E Sin@t2 − t3D,
2 2
t2 − t3 t2 + t3
CscA E Sin@t2 − t3D SinA E=E,
2 2
Point2D@80, 0<D==
Use one of the non-origin points from each of the intersection lists.
Construct a circle through the three points and examine its radius. Since its radius is one,
the circle through the three points is congruent to the other three.
In[11]: Radius2D@C123 = Circle2D@p12, p13, p23DD êê FullSimplify
Out[11] 1
Discussion
This is a plot of a numerical example.
1.5
1
0.5
0
-0.5
-1
-1.5
-1 0 1 2
knotin.nb
Approach
Construct a triangle in a simplified position. Construct the incenter. Construct the knot
circles. Show that the incenter is on one of the knot circles.
Solution
Define a function to compute the knot circles.
In[1]: KnotCircles2D@
t1 : Triangle2D@p1 : 8x1_, y1_<,
pA : 8xA_, yA_<,
p2 : 8x2_, y2_<DD :=
Module@8pt1, pt2<,
pt1 = Point2D@t1, Inscribed2DD;
pt2 = Point2D@Point2D@pAD,
Point2D@p1D,
−Distance2D@p2, pADD;
Map@Circle2D@Point2D@p1D,
Point2D@p2D, #D&,
8pt1, pt2<D D;
675
676 knotin.nb
è!!!!!!!!!!!!
!
a+ a2 + b2 b
Out[3] Point2DA9
è!!!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!! ,
è!!!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!! =E
1+ H−1 + aL2 + b2 + a2 + b2 1+ H−1 + aL2 + b2 + a2 + b2
Construct knot circles for the triangle. This result was computed using Mathematica Version
3.0.1. Version 4.0 computes a different expression for the circle’s radius that is algebraically
equivalent. The result shown in the final step is not affected by this difference.
In[4]: kc1 = KnotCircles2D@t1D@@1DD êê FullSimplify
è!!!!!!!!!!!!!!!!!!!!!!!!!
! è!!!!!!!!!!!!!
1 H−1 + aL a + b2 − H−1 + aL2 + b2 a2 + b2 1
Out[4] Circle2DA9 , =, E
2 2b &''''''''''''''''''''''''''''''''''''''''
2 +
2 HH−1+aL a+b2 L
è!!!!!!!!!!!!!!!!!!!!!!!
H−1+aL +b 2 2 è!!!!!!!!!!!!
a +b
2 2
Out[5] 0
lndet.nb
Approach
Evaluate the determinant and show that the result is equivalent to the equation of the specified
line.
Solution
Use the Det command to form the determinant.
In[1]: Clear@x, y, A1, B1, C1D;
d = Det@88x, y, 1<,
8−A1 ∗ C1, −B1 ∗ C1, A1 ^ 2 + B1 ^ 2<,
8B1, −A1, 0<<D êê Simplify
677
678 lndet.nb
Discussion
If the constant coefficient of the line is non-zero (C 6= 0) then a simpler determinant represents
the line and is given by
x y 1
−C 0 A = 0.
0 −C B
Out[3] C12 + A1 C1 x + B1 C1 y
Ax + By + C = 0
is given by
(Ax1 + By1 + C)
dv =
B
Approach
Construct a vertical (horizontal) line through the given point. Intersect the vertical (horizon-
tal) line with the given line. The required distance, dv (dh ), is the distance between P1 and
the intersection point.
Solution
Construct the vertical (horizontal) line through the given point.
679
680 lndist.nb
Find the distance between the intersection point and P1 . The expressions given by Mathe-
matica are equivalent to the desired results.
c + a x1 2
c + b y1 2
J + y1N % , $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Out[3] 9$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Jx1 + N % =
b a
Discussion
If the point is on the line, then both distances are clearly zero since the point satisfies the
equation of the line. If the line has a slope of ±1 (A = ±B), then dv = dh . If the given line is
vertical (horizontal), then the vertical (horizontal) distance formula is invalid (i.e. A or B is
zero). Here’s a function for vertical distance. The function for horizontal distance would be
similar.
In[4]: Distance2D@Point2D@8x1_, y1_<D,
Line2D@A2_, B2_, C2_D,
Vertical2DD :=
Abs@HA2 ∗ x1 + B2 ∗ y1 + C2L ê B2D ê;
Not@IsZero2D@B2DD
7
Out[5]
4
lnlndist.nb
Exploration
Let L1 and L2 be two intersecting lines and P0 a point. Describe a procedure for finding the
lines through P0 such that L1 and L2 cut off a line segment of length S > 0. Implement the
solution as a Mathematica function.
Approach
Translate L1 and L2 so that their intersection point is at the origin. L1 and L2 can then
be written as A1 x + B1 y = 0 and A2 x + B2 y = 0. The line L12 through P0 can then be
written as A12 x + B12 y + 1 = 0, since L12 cannot pass through the origin. Since P0 is on
L12 , A12 x0 + B12 y0 + 1 = 0. A second equation can be formed using the condition that the
distance between the points of intersection of (L1 and L12 ) and (L2 and L12 ) must be S.
Solve the two equations for A12 and B12 . There are two or four solutions depending on the
geometric configuration and the value of S. Translate the resulting solutions back to the
original position.
Solution
Special case first, the lines intersect at the origin. The equations are solved using NSolve to
avoid complicated exact solutions.
681
682 lnlndist.nb
Here’s the general case. It uses the special case for the core computation.
In[2]: Line2D@p0 : Point2D@8x0_, y0_<D,
l1 : Line2D@A1_, B1_, C1_D,
l2 : Line2D@A2_, B2_, C2_D,
S_ ? IsScalar2DD :=
Module@8u, v, lns<,
8u, v< = Coordinates2D@Point2D@l1, l2DD;
lns = Line2D@Translate2D@p0, −8u, v<D,
Translate2D@l1, −8u, v<D,
Translate2D@l2, −8u, v<D, SD;
Translate2D@lns, 8u, v<D D ê;
Not@IsZeroOrNegative2D@SDD && Not@IsParallel2D@l1, l2DD;
Discussion
Here’s an example of the special case that has two solutions:
L1 ≡ 2x − 3y = 0 and L2 ≡ 4x + 3y = 0 with S = 2 through the point (2, −1).
In[3]: P0 = Point2D@2, −1D;
L1 = Line2D@2, −3, 0D;
L2 = Line2D@4, 3, 0D;
L12 = Line2D@P0, L1, L2, 2D
-2
-4
-4 -2 0 2 4
lnlndist.nb 683
4
2
0
-2
-4
-4 -2 0 2 4
lnquad.nb
k1 x − k2 y − k1 x1 + k2 y1 = 0
where
Approach
Construct the polar line of the quadratic with respect to the quadratic. Construct the line
normal to the polar through the point. This is the desired normal line.
Solution
Construct the polar line (which is tangent to the quadratic if the point is on the quadratic).
685
686 lnquad.nb
Discussion
Define a function for constructing the normal line.
In[3]: Line2D@
p1 : Point2D@8x1_, y1_<D,
q1 : Quadratic2D@a_, b_, c_, d_, e_, f_D,
Normal2DD :=
Simplify@Line2D@p1, Line2D@p1, q1DDD;
-1
-2
-2 -1 0 1 2 3
lnsdst.nb
Ax + By + C1 = 0 and Ax + By + C2 = 0
is given by
s
(C2 − C1 )2
d= .
A2 + B 2
Approach
Create two lines perpendicular to both given lines and passing through the origin. Find the
points of intersection between the original lines and the perpendicular lines. Compute the
distance between the intersection points, with is the distance between the parallel lines.
Solution
Create the two given lines.
In[1]: Clear@A, B, C1, C2D;
l1 = Line2D@A, B, C1D;
l2 = Line2D@A, B, C2D;
687
688 lnsdst.nb
HC1 − C2L 2
Out[4] $%%%%%%%%%%%%%%%%%%%%%%
2 A +B 2
Discussion
Define a new function to compute the distance between two parallel lines. A more general
function could be developed that allows parallel lines whose linear coefficients are multiples
of each other.
In[5]: Distance2D@Line2D@A_, B_, C1_D,
Line2D@A_, B_, C2_DD :=
Sqrt@HC1 − C2L ^ 2 ê HA ^ 2 + B ^ 2LD;
Find the distance between the two lines 2x + 3y + 4 = 0 and 2x + 3y − 3 = 0 using the new
function.
In[6]: Distance2D@Line2D@2, 3, 4D, Line2D@2, 3, −3DD
7
Out[6]
è!!!!!
13
lnsegint.nb
where
What is the significance of the values of t1 and t2 with respect to the standard parameter range
for a line segment?
Approach
Create the two line segments and express points on each parametrically. Set the x- and
y-coordinates equal to each other and solve for t1 and t2 .
Solution
Create the two line segments.
689
690 lnsegint.nb
Equate the abscissas and ordinates and solve for the parameters.
Discussion
The significance of the values of t1 and t2 lies in the range of values which determine if the two
line segments actually intersect. If 0 ≤ t1 ≤ 1 at the intersection point, then the intersection
point is on the first line segment; if 0 ≤ t2 ≤ 1 at the intersection point, then the intersection
point is on the second line segment.
lnsegpt.nb
Approach
Construct the two lines underlying the line segments and intersect the lines.
Solution
Define the lines underlying the two line segments.
691
692 lnsegpt.nb
Discussion
Notice that the denominators of the abscissa and ordinate are equal, and that these denomi-
nators cannot be zero unless the line segments are parallel, in which case the underlying lines
do not intersect. The following is a plot of a numerical example.
1
0.5
0
-0.5
-1
-1.5
-2
-3 -2 -1 0 1 2
lnsperp.nb
Approach
The two lines A1 x + B1 y + C1 = 0 and A2 x + B2 y + C2 = 0 are perpendicular if the equation
A1 A2 +B1 B2 = 0 is true. The two pairs of lines given can be shown to be perpendicular by
examining this equation.
Solution
Formulate the perpendicular condition for the first pair of lines.
Out[1] 0
In[2]: A1 ∗ A2 + B1 ∗ B2 ê. 8
A1 −> a, B1 −> b, A2 −> 1 ê a, B2 −> −1 ê b<
Out[2] 0
693
694 lnsperp.nb
Discussion
Notice that the second pair of lines can be derived from the first by dividing the first equation
by the quantity ab. However, this is invalid if either a or b is zero. The relationship shown for
the first pair is valid for all lines. The Descarta2D function IsPerpendicular2D also verifies
that the pairs are perpendicular.
In[3]: Clear@c1D;
8IsPerpendicular2D@Line2D@a, b, cD, Line2D@b, −a, c1DD,
IsPerpendicular2D@Line2D@a, b, cD, Line2D@1 ê a, −1 ê b, c1DD<
Approach
Show that the pole point (which is the point of tangency if the line is tangent to the circle) is
on the circle.
Solution
Construct the line.
In[1]: Clear@x, y, a, mD;
l1 = Line2D@y == m Hx − aL + a ∗ Sqrt@1 + m ^ 2D, 8x, y<D
è!!!!!!!!!!!2
Out[1] Line2DA−m, 1, a m − a 1+m E
è!!!!!2
Out[2] Circle2DA8a, 0<, a E
am a
Out[3] Point2DA9a −
è!!!!!!!!!!! ,
è!!!!!!!!!!! =E
1 + m2 1 + m2
The coordinates of the pole point satisfy the equation of the circle.
695
696 lntancir.nb
Out[4] 0
Discussion
This is a plot of a numerical example.
2
1
0
-1
-2
-2 -1 0 1 2
lntancon.nb
px + qy + r = 0
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
is given by
4CF − E 2 p2 + 4AF − D2 q 2 + 4AC − B 2 r2 +
Approach
Intersect the line and the conic and force the intersection points to be coincident by setting
the appropriate terms in the resulting expression to zero.
Solution
Solve the equation of the line for y.
In[1]: Clear@p, q, r, x, yD;
ans1 = Solve@p ∗ x + q ∗ y + r == 0, yD
r+px
Out[1] 99y → − ==
q
697
698 lntancon.nb
E1 Hr + p xL B1 x Hr + p xL C1 Hr + p xL2
Out[2] F1 + D1 x + A1 x2 − − +
2
q q q
H2 HC1 p2 − B1 p q + A1 q2LL=,
9x → IE1 p q − D1 q2 − 2 C1 p r + B1 q r + , IH−E1 p q + D1 q2 + 2 C1 p r − B1 q rL −
2
The line is tangent if the expression under the radical is zero (i.e. the points of tangency are
coincident).
2
Out[4] H−E1 p q + D1 q2 + 2 C1 p r − B1 q rL − 4 HC1 p2 − B1 p q + A1 q2L HF1 q2 − E1 q r + C1 r2L
Pick out the coefficients of each of the desired terms (multiplied by −1 to match the desired
sign).
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
2
A = 4 (h1 − h2 ) − R ,
B = 8 (h1 − h2 ) (k1 − k2 ),
2
C = 4 (k1 − k2 ) − R ,
and
R = (r1 − sr2 )2 ,
D1 = h21 + k12 ,
s = ±1
699
700 mdcircir.nb
Approach
Create the two circles and form an equation by equating the distance to each circle from a
generic point.
Solution
Create the geometry.
In[1]: Clear@x, y, h1, k1, r1, h2, k2, r2D;
P = Point2D@x, yD;
C1 = Circle2D@8h1, k1<, r1D;
C2 = Circle2D@8h2, k2<, r2D;
"###########################################
Out[2] s1 J−r1 + H−h1 + xL2 + H−k1 + yL2 N
In[3]: Clear@s2D;
d2 = s2 ∗ HDistance2D@P, Point2D@C2DD − r2L
"###########################################
Out[3] s2 J−r2 + H−h2 + xL2 + H−k2 + yL2 N
"##############################################################
Out[4] s1 J−r1 + h12 + k12 − 2 h1 x + x2 − 2 k1 y + y2 N −
"##############################################################
s2 J−r2 + h22 + k22 − 2 h2 x + x2 − 2 k2 y + y2 N
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Out[6] 9−r1 s1 + s1 D1 − 2 h1 x + x2 − 2 k1 y + y2 , r2 s2 − s2 D2 − 2 h2 x + x2 − 2 k2 y + y2 =
Out[7] −D1 − D2 + R + 2 h1 x + 2 h2 x − 2 x2 + 2 k1 y + 2 k2 y − 2 y2 +
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2s D1 − 2 h1 x + x2 − 2 k1 y + y2 D2 − 2 h2 x + x2 − 2 k2 y + y2
mdcircir.nb 701
2
Out[8] H−D1 − D2 + R + 2 h1 x + 2 h2 x − 2 x2 + 2 k1 y + 2 k2 y − 2 y2L −
4 s2 HD1 − 2 h1 x + x2 − 2 k1 y + y2L HD2 − 2 h2 x + x2 − 2 k2 y + y2L
In[9]: Q1 = Map@Factor,
Quadratic2D@eq4 ê. s ^ 2 −> 1, 8x, y<DD êê. 8
s ^ 2 −> 1,
h1 ^ 2 − 2 ∗ h1 ∗ h2 + h2 ^ 2 −> Hh1 − h2L ^ 2,
k1 ^ 2 − 2 ∗ k1 ∗ k2 + k2 ^ 2 −> Hk1 − k2L ^ 2,
D1 ^ 2 − 2 ∗ D1 ∗ D2 + D2 ^ 2 −> HD1 − D2L ^ 2<
By inspection, the resulting quadratic is the same as the desired one. This result was computed
using Mathematica Version 3.0.1. Version 4.0 computes a slightly different result that is
algebraically equivalent.
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = B12 ,
B = −2A1 B1 ,
C = A21 ,
s = ±1.
A1 x + B1 y + C1 = 0
703
704 mdlncir.nb
Approach
Create the line and the circle. Form an equation of the distances from a generic point to the
line and circle.
Solution
Create the geometry.
In[1]: Clear@x, y, A1, B1, C1, h2, k2, r2D;
P = Point2D@x, yD;
l1 = Line2D@A1, B1, C1D;
c2 = Circle2D@8h2, k2<, r2D;
Find the distance from the point to the line, where s1 = ±1.
In[2]: Clear@s1, E1D;
d1 = s1 ∗ Distance2D@P, l1D êê.
8A1 ^ 2 + B1 ^ 2 −> 1, Sqrt@E1_ ^ 2D −> E1<
Out[2] s1 HC1 + A1 x + B1 yL
Find the distance from the point to the circle, where s2 = ±1.
In[3]: Clear@s2D;
d2 = s2 ∗ HDistance2D@P, Point2D@c2DD − r2L êê Expand
"###########################################
Out[3] −r2 s2 + s2 H−h2 + xL2 + H−k2 + yL2
Put the quadratic into the desired form, and use s = s1 s2 = ±1.
In[6]: Clear@s, a, b, cD;
Q2 = HMap@Factor@−1 ∗ #D&, Q1D ê. s1 ∗ s2 −> sL ê. a_ ∗ b_ + a_ ∗ c_ −> a Hb + cL
Out[6] Quadratic2D@B12, −2 A1 B1, A12, −2 Hh2 + A1 HC1 + r2 sLL, −2 Hk2 + B1 HC1 + r2 sLL,
−C12 + h22 + k22 − r22 − 2 C1 r2 sD
mdlnln.nb
A1 x + B1 y + C1 A2 x + B2 y + C2
p =± p
A21 + B12 A22 + B22
Approach
Create both lines. Compute the distances to an arbitrary point. Form an equation by setting
the distances equal to each other.
Solution
Create the two lines.
In[1]: Clear@x, y, A1, B1, C1, A2, B2, C2D;
P = Point2D@x, yD;
l1 = Line2D@A1, B1, C1D;
l2 = Line2D@A2, B2, C2D;
Compute the distance from the first line. Use s1 = ±1 to eliminate the radical.
s1 HC1 + A1 x + B1 yL
Out[2]
è!!!!!!!!!!!!!!!!!
A12 + B12
705
706 mdlnln.nb
Compute the distance from the second line. Use s2 = ±1 to eliminate the radical.
In[3]: Clear@s2D;
d2 = Distance2D@P, l2D ê.
Sqrt@E1_ ^ 2 ê E2_D :> s2 ∗ E1 ê Sqrt@E2D
s2 HC2 + A2 x + B2 yL
Out[3]
è!!!!!!!!!!!!!!!!!
A22 + B22
s1 HC1 + A1 x + B1 yL s2 HC2 + A2 x + B2 yL
è!!!!!!!!!!!!!!!!! ==
Out[4] è!!!!!!!!!!!!!!!!!
A12 + B12 A22 + B22
In[5]: Clear@sD;
eq1 ê. 8s1 −> 1, s2 −> s<
C1 + A1 x + B1 y s HC2 + A2 x + B2 yL
Out[5]
è!!!!!!!!!!!!!!!!! ==
è!!!!!!!!!!!!!!!!!
A12 + B12 A22 + B22
mdptcir.nb
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = 4 (x1 − h2 )2 − r22 ,
B = 8 (x1 − h2 ) (y1 − k2 ),
2
C = 4 (y1 − k2 ) − r22 ,
D = 4 R(x1 − h2 ) + 2r22 x1 ,
E = 4 R(y1 − k2 ) + 2r22 y1 ,
(x − h2 )2 + (y − k2 )2 = r22 .
Approach
Create the point and the circle. Compute the distances to an arbitrary point. Set the distances
equal to form the equation.
707
708 mdptcir.nb
Solution
Create the point and the circle.
The distance to the circle is either D − r or r − D, where D is the distance from the point to
the center of the circle. Squaring removes the ambiguity.
"###########################################
Out[3] r22 + H−h2 + xL2 + H−k2 + yL2 − 2 r2 H−h2 + xL2 + H−k2 + yL2
In[5]: Clear@RD;
ls2 = ls1 ê.
8−h2 ^ 2 − k2 ^ 2 + x1 ^ 2 + y1 ^ 2 − r2 ^ 2 −> −2 ∗ r2 ^ 2 − R<
Out[5] −R − 2 r22 + 2 h2 x − 2 x x1 + 2 k2 y − 2 y y1
In[8]: b = Factor@Q1@@2DDD ê. Hh2 − x1L Hk2 − y1L −> Hx1 − h2L Hy1 − k2L
In[12]: f = Factor@Q1@@6DDD ê.
4 ∗ R ∗ r2 ^ 2 −> 4 ∗ r2 ^ 2 ∗ Hh2 ^ 2 + k2 ^ 2 − Hx2 ^ 2 + y2 ^ 2L − r2 ^ 2L êê Expand;
f1 = f@@1DD + Factor@f@@82, 3<DDD
Out[13] Quadratic2D@4 H−r22 + H−h2 + x1L2L, 8 H−h2 + x1L H−k2 + y1L, 4 H−r22 + H−k2 + y1L2L,
4 H2 r22 x1 + R H−h2 + x1LL, 4 H2 r22 y1 + R H−k2 + y1LL, R2 − 4 r22 Hx22 + y22LD
mdptln.nb
Exploration
Show that the quadratic equation
Ax2 + Bxy + Cy 2 + Dx + Ey + F = 0
where
A = B22 ,
B = −2A2 B2 ,
C = A22 ,
D = −2 (x1 + A2 C2 ),
E = −2(y1 + B2 C2 ) and
is equidistant from the point P1 (x1 , y1 ) and the line L ≡ A1 x + B1 y + C1 = 0, assuming that
L is normalized (A22 + B22 = 1).
Approach
Create the point and the line. Compute distances to an arbitrary point. Form an equation by
setting the distances equal to each other.
711
712 mdptln.nb
Solution
Create the point and the line.
HC2 + A2 x + B2 yL2
Out[2] Hx − x1L2 + Hy − y1L2 ==
2
A2 + B2 2
Out[3] Quadratic2D@B22, −2 A2 B2, A22, −2 HA2 C2 + x1L, −2 HB2 C2 + y1L, −C22 + x12 + y12D
mdptpt.nb
Approach
Create the points and compute distances to an arbitrary point. Form an equation by setting
the distances equal to each other.
Solution
Create the points.
In[1]: Clear@x, y, x1, y1, x2, y2D;
P = Point2D@x, yD;
p1 = Point2D@x1, y1D;
p2 = Point2D@x2, y2D;
Form an equation by setting the distances (squared) to the arbitrary point equal to each other.
In[2]: eq1 = Distance2D@P, p1D ^ 2 ==
Distance2D@P, p2D ^ 2
Out[3] Line2D@−2 Hx1 − x2L, −2 Hy1 − y2L, x12 − x22 + y12 − y22D
713
mdtype.nb
Approach
Create the expression B 2 − 4AC from the coefficients of the medial quadratic. Consider
B 2 − 4AC with the circle at the origin. Show that the expression is negative when the point
is inside the circle and positive when the point is outside the circle.
Solution
Set the coefficients of the quadratic (from equations listed in the book).
Using the distance formula, the point is outside the circle then the discriminant is positive,
implying a hyperbola; if the point is inside the circle than the discriminant is negative, implying
an ellipse.
715
monge.nb
Monge’s Theorem
Exploration
Given three circles and the external tangent lines of the circles taken in pairs, show that the
three intersection points of the three tangent pairs lie on a straight line.
Approach
Construct the three circles in a simplified position (without loss of generality). Construct the
intersection point of the tangent pairs of lines. Show that the points are collinear.
Solution
Create the three circles.
Find the intersection point of the external tangents for the first pair.
d r1
Out[2] Point2DA9 , 0=E
r1 − r2
Find the intersection point of the external tangents for the second pair.
717
718 monge.nb
a r2 − d r3 b r2
Out[3] Point2DA9 , =E
r2 − r3 r2 − r3
Find the intersection point of the external tangents for the third pair.
In[4]: t13 = TangentLines2D@c1, c3D;
p13 = Point2D@t13@@1DD êê Simplify,
t13@@2DD êê SimplifyD êê Simplify
a r1 b r1
Out[4] Point2DA9 , =E
r1 − r3 r1 − r3
The three points are collinear as shown by the zero value of the determinant. The function
IsCollinear2D produces the same result.
In[5]: MakeRow$2D@Point2D@8x_, y_<DD := 8x, y, 1<;
8Det@Map@MakeRow$2D, 8p12, p23, p13<DD êê Simplify,
IsCollinear2D@p12, p23, p13D<
Discussion
This is the plot of a numerical example.
In[6]: Sketch2D@8c1, c2, c3,
t12, p12, t13, p13, t23, p23,
Line2D@p12, p23D< ê.
8r1 −> 1, r2 −> 2, r3 −> 3, d −> 5, a −> 3, b −> 6<,
CurveLength2D −> 35D;
15
10
5
0
-5
-10
-15
-15-10 -5 0 5 10 15
narclen.nb
Approach
Sum the distances between the points on the curve.
Solution
Define a function for the arc length by polygonal approximation.
In[1]: Off@General::spell1D;
NArcLength2D@obj_, 8t1_, t2_<, n_D :=
Module@8incr = Ht2 − t1L ê n<,
Sum@
Distance2D@
obj@t1 + i ∗ incrD êê N,
obj@t1 + Hi + 1L ∗ incrD êê ND,
8i, 0, n − 1<D D;
On@General::spell1D;
719
720 narclen.nb
Create a table of coordinates to plot. The x-coordinate is the number of points used in the
approximation and the y-coordinate is the difference between the Descarta2D function and
the polygonal approximation.
In[3]: t1 = 1 ê 4;
t2 = 3 ê 4;
arclen1 = ArcLength2D@ca1, 8t1, t2<D êê N;
pts = Table@8n, arclen1 − NArcLength2D@ca1, 8t1, t2<, nD<,
8n, 10, 100, 5<D
0.0001
0.00008
0.00006
0.00004
0.00002
20 40 60 80 100
normal.nb
Approach
The point P (x, y) is clearly on Q, so P must satisfy the equation for Q. In addition, since the
normal line P P0 is perpendicular to the tangent line, its slope must be the negative reciprocal
of the tangent line’s slope. The tangent line is the polar of P with respect to Q. These two
equations can be solved simultaneously for the (x, y) coordinates of the point P .
Solution
Define a function to construct the point(s) P based on the approach described above.
In[1]: NormalPoints2D@
P0 : Point2D@8x0_, y0_<D,
Q : Quadratic2D@a_, b_, c_, d_, e_, f_DD :=
Module@8P, x, y, ln, eq1, eq2, ans<,
eq1 = Equation2D@Q, 8x, y<D;
P = Point2D@8x, y<D;
ln = Line2D@P, −1 ê Slope2D@Line2D@P0, PDDD;
eq2 = TangentEquation2D@ln, QD;
ans = Solve2D@8eq1, eq2<, 8x, y<D;
ans = Select@ans, HIsReal2D@x ê. #D &&
IsReal2D@y ê. #DL&D;
Map@HP ê. #L&, ansDD ê;
IsNumeric2D@8P0, Q<, NormalPoints2DD
721
722 normal.nb
Define a function to construct the normal lines using the normal points.
In[2]: NormalLines2D@
P0 : Point2D@8x0_, y0_<D,
Q : Quadratic2D@a_, b_, c_, d_, e_, f_DD :=
Map@Line2D@#, QD&, NormalPoints2D@P0, QDD ê;
IsNumeric2D@8P0, Q<, NormalLines2DD
Discussion
Here we illustrate the solution with a numerical example. The following steps were computed
using Mathematica Version 3.0.1. Version 4.0 computes the same points and lines without
duplicating the solutions.
In[4]: p0 = Point2D@2., 2.D;
q1 = Quadratic2D@Ellipse2D@80, 0<, 2, 1, 0DD;
pts = NormalPoints2D@p0, q1D
2
1
0
-1
-2
-3
-3 -2 -1 0 1 2 3
Out[7] 1.4188
pb3pts.nb
Exploration
Show that the parabola passing through the points (0, 0), (a, b) and (b, a) whose axis is parallel
to the x-axis has vertex (h, k) and focal length f given by
(a2 + ab + b2 )2 a2 + ab + b2 ab
h= , k= and f = − .
4ab(a + b) 2(a + b) 4(a + b)
Approach
Create the equation of a parabola in standard position with variables (h, k) for the vertex
point and f for the focal length. The three given points must satisfy the equation. Solve three
equations in three unknowns (h, k and f ). Find the quadratic representing the equation.
Solution
Write the equation of the parabola in standard position.
723
724 pb3pts.nb
ab a2 + a b + b2
Out[3] Quadratic2DA0, 0, 1, , − , 0E
a+b a+b
Discussion
This is a plot of a numerical example with a = 2 and b = 3.
In[5]: Sketch2D@8Point2D@80, 0<D, Point2D@8a, b<D,
Point2D@8b, a<D, q1< ê. 8
a −> 2, b −> 3<D;
4
3
2
1
0
-1 0 1 2 3
pb4pts.nb
Exploration
Describe a method for finding the two parabolas passing through four points. Show that the
technique produces the correct results for the points (2, 1), (−1, 1), (−2, −1) and (4, −3) by
plotting the parabola and the four points.
Approach
Form a quadratic, parameterized by the variable k, representing the pencil of quadratics
passing through the four points. The first three coefficients of the quadratic, a, b, and c must
satisfy the relationship b2 = 4ab because the quadratic is a parabola. Solve the equation for
k.
Solution
Define a function that implements the approach.
In[1]: Quadratic2D@
p1 : Point2D@8x1_, y1_<D,
p2 : Point2D@8x2_, y2_<D,
p3 : Point2D@8x3_, y3_<D,
p4 : Point2D@8x4_, y4_<D,
Parabola2DD :=
Module@8q1, k, a, b, c<,
q1 = Quadratic2D@p1, p2, p3, p4, k, Pencil2DD;
8a, b, c< = List @@ Take@q1, 3D;
ans = Solve@b ^ 2 == 4 ∗ a ∗ c, kD;
Map@Hq1 ê. #L&, ansD D;
725
726 pb4pts.nb
Discussion
The following is a numerical example using the points specified.
2
1
0
-1
-2
-3
-4 -2 0 2 4 6
pbang.nb
Approach
Find the (real) intersection points of the two parabolas (the origin point is an intersection,
but the cut angle at the origin is π, so use one of the other (real) angles). Construct the polars
to each parabola at the intersection point (the polars are the tangent lines). Find the angle
between the polars.
Solution
Intersect the two parabolas.
The first solution is the origin, so it is excluded. The third and fourth solutions are imaginary,
so they are ignored. The second solution is the desired one.
727
728 pbang.nb
a b π
Out[3] 99Parabola2DA80, 0<, , 0E=, 9Parabola2DA80, 0<, , E==
4 4 2
Out[4] 8Line2D@−a, 2 a2ê3 b1ê3, −a4ê3 b2ê3D, Line2D@2 a1ê3 b2ê3, −b, −a2ê3 b4ê3D<
a1ê3 2 a1ê3
Out[5] −ArcTanA
1ê3 E + ArcTanA
1ê3 E
2b b
Discussion
Here’s an example with a = 1 and b = 2.
4
3
2
1
0
-1
-2
-2 -1 0 1 2 3 4
1
Out[7] −ArcTanA
1ê3 E + ArcTan@2
2ê3
D
22
Out[8] 36.145
pbarch.nb
Parabolic Arch
Exploration
y b
PJ ÄÄÄÄÄÄÄ , hN
2
b x
Find the equation of the parabolic arch of base b and height h as shown in the figure. Assume
that b and h are positive.
Approach
Create a parabola rotated −π/2 radians with variables (h, k) and f for the vertex point and
focal length. Find the quadratic equation of the parabola. The three given points (0, 0),
(b/2, h) and (b, 0) must satisfy the equation. Solve three equations in the three unknowns h,
k and f .
Solution
Construct the parabola.
729
730 pbarch.nb
Out[2] h2 − 4 f k − 2 h x + x2 + 4 f y == 0
B2 B
Out[3] 99k → H, f → , h → ==
16 H 2
B2 y
Out[4] −B x + x2 + == 0
4H
Discussion
This is an example of the arch with B = 4 and H = 3.
0 1 2 3 4
pbarclen.nb
x = f t2 and y = 2f t
Approach
Directly apply the integral definition of arc length.
Solution
Compute the indefinite integral first. The results shown in the next few steps were computed
using Mathematica Version 3.0.1. Version 4.0 computes slightly different results that are
algebraically equivalent. Both versions compute the same final step.
è!!!!!!!!!!!!!!!!!!!! i ArcSinh@tD z y
Out[1] f2 H1 + t2L j jt +
è!!!!!!!!!!!2 z
k 1+t {
731
732 pbarclen.nb
# i
"###################### ArcSinh@t1D y # i
z + "###################### ArcSinh@t2D y
Out[2] − f2 H1 + t12L j jt1 +
è!!!!!!!!!!!!!2 z f2 H1 + t22L j jt2 +
è!!!!!!!!!!!!!2
z
z
k 1 + t1 { k 1 + t2 {
Simplify.
In[4]: s3 = Factor@s2D
"#############2 "#############
Out[4] −f Jt1 1 + t1 − t2 1 + t22 + ArcSinh@t1D − ArcSinh@t2DN
"#############2 "#############
Out[5] f J−t1 1 + t1 + t2 1 + t22 − ArcSinh@t1D + ArcSinh@t2DN
pbdet.nb
Parabola Determinant
Exploration
Show that the determinant
y x2 x 1
y1 x21 x1 1
=0
y2 x22 x2 1
y3 x23 x3 1
Approach
Expand the determinant. Convert it to a quadratic and show that the three points satisfy the
equation.
Solution
Expand the determinant and form a quadratic.
In[1]: Clear@x, y, x1, y1, x2, y2, x3, y3D;
eq1 = Det@88y, x ^ 2, x, 1<,
8y1, x1 ^ 2, x1, 1<,
8y2, x2 ^ 2, x2, 1<,
8y3, x3 ^ 2, x3, 1<<D;
q1 = Quadratic2D@eq1, 8x, y<D
733
734 pbdet.nb
Out[2] Hx12 x2 − x1 x22 − x12 x3 + x22 x3 + x1 x32 − x2 x32L y − x22 x3 y1 + x2 x32 y1 + x12 x3 y2 −
x1 x32 y2 − x12 x2 y3 + x1 x22 y3 + x2 H−x2 y1 + x3 y1 + x1 y2 − x3 y2 − x1 y3 + x2 y3L +
x Hx22 y1 − x32 y1 − x12 y2 + x32 y2 + x12 y3 − x22 y3L
Discussion
This is a plot of a numerical example.
In[4]: p1 = Point2D@8x1, y1<D;
p2 = Point2D@8x2, y2<D;
p3 = Point2D@8x3, y3<D;
Sketch2D@8p1, p2, p3, q1< êê. 8
x1 −> 1, y1 −> 1, x2 −> 6, y2 −> −1,
x3 −> 4, y3 −> 2<D;
-1
0 1 2 3 4 5 6
pbfocchd.nb
Approach
Construct a parabola in a standard position. Construct a line perpendicular to the axis of the
parabola through the focus point (the line containing the focal chord). Compute the distance
between the points of intersection of the parabola and the line.
Solution
Create the parabola.
In[1]: Clear@f1D;
par1 = Parabola2D@80, 0<, f1, 0D;
735
736 pbfocchd.nb
The length of the focal chord is the distance between the points.
Out[5] 4 f1
pbslp.nb
Approach
Construct a line with slope m and use the function TangentLines2D[ln, quad] to construct
the desired tangent line.
Solution
Construct a line with slope m.
Construct a line parallel to the line and tangent to the parabola. The tangent line has the
form expected.
In[2]: Clear@pD;
l2 = TangentLines2D@l1,
p1 = Parabola2D@80, 0<, p, 0DD
p
Out[2] 9Line2DAm, −1, E=
m
Discussion
This is the plot of a numerical example.
737
738 pbslp.nb
-2
-4
-2-1 0 1 2 3 4
pbtancir.nb
Approach
Construct the geometry and show that the lines tangent to the parabola and the circle at the
intersection point are coincident.
Solution
Construct the point, parabola and a line through the point.
è!!!!!!!!!!!!!!!!!!!!!!! ! è!!!!!!!!!!!!!!!!!!!!!!!!
−2
a2 H1 − 3 m2L + a H2 − 3 m2L 2 I−a + a2 H1 − 3 m2L M
Out[2] 9Point2DA9
2 , − =E,
m m
è!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!
2 a2 H1 − 3 m2L + a H2 − 3 m2L 2 Ia + a2 H1 − 3 m2L M
Point2DA9
, =E=
m2 m
739
740 pbtancir.nb
a H3 + m L a−3am 2 1 a H1 + m L
2 2 2 3
2 ,
Out[3] Circle2DA9 3 =, $%%%%%%%%%%%%%%%%%%%%%%%%
6 E
2m 2m 2 m
a 2a
Out[4] 9Point2DA9
2 , − =E,
m m
è!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!
−2 a2 H1 − 3 m2L + a H2 − 3 m2L 2 I−a + a2 H1 − 3 m2L M
Point2DA9
2 , − =E,
m m
è!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!
2 a2 H1 − 3 m2L + a H2 − 3 m2L 2 Ia + a2 H1 − 3 m2L M
Point2DA9
, =E=
m2 m
Two of the points are P and Q, as expected; the third must be the tangency point.
a 2a
Out[5] 9Point2DA9
2 , − =E,
m m
è!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!
−2 a2 H1 − 3 m2L + a H2 − 3 m2L 2 I−a + a2 H1 − 3 m2L M
Point2DA9
2 , − =E,
m m
è!!!!!!!!!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!!!!!!!!!
2 a2 H1 − 3 m2L + a H2 − 3 m2L 2 Ia + a2 H1 − 3 m2L M
, =E=
Point2DA9
m2 m
Two of the points are P and Q, as expected; the third must be the tangency point.
Construct the tangents to the circle and the parabola at the intersection point.
The tangents are coincident, therefore, the parabola and the circle are tangent.
Discussion
This is the plot of a numerical example.
pbtancir.nb 741
6
4
2
0
-2
-4
-6
-2 0 2 4 6 8 10
pbtnlns.nb
Exploration
Show that if L1 and L2 are two lines tangent to a parabola that intersect on the directrix of
the parabola, then L1 and L2 are perpendicular to each other.
Approach
Since the shape (not the position or orientation) of the parabola is relevant, pick a parabola
in standard position and a point on the parabola’s directrix. Construct the tangent lines from
the point to the parabola and show that the lines are perpendicular (i.e. their slopes are
negative reciprocals).
Solution
Create the parabola and its directrix.
In[1]: Clear@fD;
parab1 = Parabola2D@80, 0<, f, 0D;
dln = First@Directrices2D@parab1DD
Out[1] Line2D@1, 0, fD
In[2]: Clear@yD;
p1 = Point2D@−f, yD;
743
744 pbtnlns.nb
è!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!
Out[3] 9Line2DA2 f 4 f2 + y2 , 4 f2 + y Iy − 4 f2 + y2 M,
è!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!! è!!!!!!!!!!!!!!!!
2 f I−2 y + 4 f2 + y2 M + y I−y + 4 f2 + y2 ME, Line2DA−2 f 4 f2 + y2 ,
2 2
Show that the slopes are negative reciprocal (therefore the lines are perpendicular to each
other).
Out[4] −1
Discussion
This is the plot of a numerical example.
10
-5
-10
-4-2 0 2 4 6 8
polarcir.nb
Approach
Represent the circle in rectangular coordinates. Convert the equation to polar coordinates.
Solution
Define a function to convert from polar coordinates to rectangular coordinates.
In[1]: Point2D@PolarPoint2D@r_, theta_DD :=
Point2D@8r ∗ Cos@thetaD, r ∗ Sin@thetaD<D;
745
polarcol.nb
Approach
Convert the given polar coordinates of the points to rectangular coordinates and then apply
the condition for collinearity
x1 y1 1
x2 y2 1 = 0.
x3 y3 1
Solution
This is a function for converting a polar point to rectangular coordinates.
747
748 polarcol.nb
In[3]: Simplify@
Det@8
8XCoordinate2D@p1D, YCoordinate2D@p1D, 1<,
8XCoordinate2D@p2D, YCoordinate2D@p2D, 1<,
8XCoordinate2D@p3D, YCoordinate2D@p3D, 1<
<D
D
Discussion
Here’s a function based on the equation above that returns True if three points in polar
coordinates are collinear.
In[4]: IsCollinear2D@
p1 : PolarPoint2D@r1_, theta1_D,
p2 : PolarPoint2D@r2_, theta2_D,
p3 : PolarPoint2D@r3_, theta3_DD :=
IsZero2D@−r1 ∗ r2 ∗ Sin@theta1 − theta2D +
r1 ∗ r3 ∗ Sin@theta1 − theta3D −
r2 ∗ r3 ∗ Sin@theta2 − theta3DD
Show that the polar coordinate points (1, π/3), (3, π/3) and (5, 4π/3) are collinear using the
new function.
In[5]: p1 = PolarPoint2D@1, Pi ê 3D;
p2 = PolarPoint2D@3, Pi ê 3D;
p3 = PolarPoint2D@5, 4 ∗ Pi ê 3D;
IsCollinear2D@p1, p2, p3D
Out[5] True
polarcon.nb
Approach
Use the definition of eccentricity e = P F/P D and substitute the expressions for distances.
Solve the resulting equations for r.
Solution
Use the definition of eccentricity.
In[1]: Clear@e, PF, PDD;
eq1 = e == PF ê PD
PF
Out[1] e ==
PD
749
750 polarcon.nb
Solve for r.
In[3]: Solve@eq2, rD êê Simplify
ep
Out[3] 99r → ==
1 − e Cos@tD
polardis.nb
Approach
Convert the given polar coordinates of the points to rectangular coordinates and then apply
the Distance2D function to the converted points.
Solution
This is a function for converting a polar point to rectangular coordinates.
In[1]: Point2D@PolarPoint2D@r_, theta_DD :=
Point2D@8r ∗ Cos@thetaD, r ∗ Sin@thetaD<D;
"############################################################################
#
Out[3] r12 + r22 − 2 r1 r2 Cos@theta1 − theta2D
751
752 polardis.nb
Discussion
Distance2D can be defined to handle polar coordinates directly as shown here.
In[4]: Distance2D@PolarPoint2D@r1_, theta1_D,
PolarPoint2D@r2_, theta2_DD :=
Sqrt@r1 ^ 2 + r2 ^ 2 − r1 ∗ r2 ∗ Cos@theta1 − theta2DD
"#########################################################################
Out[5] r12 + r22 − r1 r2 Cos@theta1 − theta2D
polarell.nb
where a and b are the lengths of the semi-major and semi-minor axes, respectively.
Approach
Create the ellipse in rectangular coordinates. Convert the equation to polar coordinates.
Solution
Create a quadratic representing the ellipse.
In[1]: Clear@a, bD;
Q1 = Quadratic2D@Ellipse2D@80, 0<, a, b, 0DD
Put into the desired form by solving for r (taking the positive result).
753
754 polarell.nb
In[3]: Solve@eq1, rD
ab
Out[3] 99r → −
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =,
2 b Cos@thetaD + a Sin@thetaD 2 2 2
ab
9r →
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ==
b2 Cos@thetaD2 + a2 Sin@thetaD2
polareqn.nb
Polar Equations
Exploration
A curve in polar coordinates may have more than one equation. A given point may have either
of two general coordinate representations
(r, θ + 2kπ)
(−r, θ + (2k + 1) π)
for any integer k. Hence a given curve r = f (θ) may have either of the two equation forms
r = f (θ + 2kπ)
−r = f (θ + (2k + 1) π).
The first equation reduces to r = f (θ) when k = 0, but may lead to an entirely different
equation of the same curve for another value of k. Similarly, the second equation may yield
other equations of the curve. Show that in spite of the potential for multiple equations in
polar coordinates, a linear equation Ax + By + C = 0 has only one representation in polar
coordinates given by
Approach
Derive an equation for a linear equation in polar coordinates using the primary form (r, θ).
Investigate and compare the primary form to the equation derived from the forms (r, θ + 2kπ)
and (−r, θ + (2k + 1) π).
755
756 polareqn.nb
Solution
Create the primary form of a linear equation in polar coordinates.
Compare to the form (−r, θ + (2k + 1) π), using two trigonometric identities.
In[3]: A1 ∗ x + B1 ∗ y + C1 êê.
8x −> −r ∗ Cos@t + H2 k + 1L ∗ PiD,
y −> −r ∗ Sin@t + H2 k + 1L ∗ PiD,
Cos@t + H2 k + 1L ∗ PiD −> −Cos@tD,
Sin@t + H2 k + 1L ∗ PiD −> −Sin@tD<
Approach
Create the hyperbola in rectangular coordinates and convert the equation to polar coordinates.
Solution
Define a quadratic representing the hyperbola.
In[1]: Clear@a, bD;
Q1 = Quadratic2D@Hyperbola2D@80, 0<, a, b, 0DD
Solve for r to put the equation into the desired form. This result was computed using Math-
ematica Version√3.0.1. Version 4.0 produces a slightly different result that is algebraically
equivalent with −1 already factored out.
757
758 polarhyp.nb
Iab
Out[3] 99r → −
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =,
2!
2 −b Cos@thetaD + a Sin@thetaD 2 2
Iab
9r →
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ==
−b2 Cos@thetaD2 + a2 Sin@thetaD2
√
Multiply the fraction by i = −1 to get the desired form.
ab
Out[4] 9r →
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =
b2 Cos@thetaD2 − a2 Sin@thetaD2
polarpb.nb
Approach
Create the parabola in rectangular coordinates. Convert the equation to polar coordinates.
Solution
Construct the quadratic representing the parabola.
In[1]: Clear@fD;
Q1 = Quadratic2D@Parabola2D@80, 0<, f, 0DD
Out[1] Quadratic2D@0, 0, 1, −4 f, 0, 0D
759
760 polarpb.nb
In[3]: Solve@eq1, rD
The trigonometric identity 4f cot(θ) csc(θ) = 4f cos(θ)/sin2 (θ) completes the demonstration.
Approach
Convert the given polar coordinates of the points to rectangular coordinates and demonstrate
that the rectangular coordinates are coincident.
Solution
This is a function for converting a polar point to rectangular coordinates.
In[1]: Point2D@PolarPoint2D@r_, theta_DD :=
Point2D@8r ∗ Cos@thetaD, r ∗ Sin@thetaD<D;
Simplifying shows that the points are identical for all values of k.
In[3]: pts êê Simplify
761
762 polarunq.nb
Discussion
The principal polar coordinates of a point (r, θ) are given when r > 0 and 0 ≤ θ < 2π. These
functions convert a PolarPoint2D to principal coordinates.
3π 5π
Out[5] 9PolarPoint2DA1, E, PolarPoint2DA2, E=
2 3
pquad.nb
Parameterization of a Quadratic
Exploration
Show that the quadratic Q ≡ ax2 + bxy + cy 2 + dx + ey = 0, that passes through the origin,
can be parameterized by the equations
d + et t(d + et)
x(t) = − and y(t) = −
a + t(b + ct) a + t(b + ct)
Approach
Let the parameter, t, be the slope of a line, L, passing through the origin. The coordinates
of the point P (x(t), y(t)), which is the desired parameterization, is the intersection point of L
with Q that is not coincident with the origin.
Solution
Define a function that returns parametric equations of a quadratic, given a point on the
quadratic, in terms of a parameter, t.
If the point on the quadratic is the origin, (0, 0), then the equations are given by the following.
763
764 pquad.nb
d+et t Hd + e tL
Out[2] 9− , − =
a + t Hb + c tL a + t Hb + c tL
Discussion
√
As an example, parameterize the quadratic 5x2 − 3 3xy + 4y 2 − 8x − 14y = 0.
In[3]: Clear@tD;
Q = Quadratic2D@5, −3 ∗ Sqrt@3D, 4, −8, −14, 0D;
XtYt = Parameterize2D@Q, Point2D@80, 0<D, tD
2 H4 + 7 tL 2 H4 t + 7 t2L
Out[3] 9
è!!! ,
è!!! =
5 − 3 3 t + 4 t2 5 − 3 3 t + 4 t2
Plot the quadratic using the parametric equations. Notice the gap in the graph as the para-
meter, t, approaches ±∞.
In[4]: ParametricPlot@Evaluate@XtYtD, 8t, −25, 25<,
AspectRatio −> AutomaticD;
7
6
5
4
3
2
1
12345
An identical graph is produced from the equation in standard form. The gap is not present in
this plot because the trigonometric parameterization of the ellipse, used to plot the standard
form, avoids passing through infinity.
In[6]: Sketch2D@8crv<D;
7
6
5
4
3
2
1
0
012345
ptscol.nb
Collinear Points
Exploration
Show that the three points (3a, 0), (0, 3b) and (a, 2b) are collinear.
Approach
Three points P1 (x1 , y1 ), P2 (x2 , y2 ) and P3 (x3 , y3 ) are collinear if the determinant
x1 y1 1
x2 y2 1
x3 y3 1
is zero.
Solution
Use the Mathematica Det command to evaluate the determinant.
Out[1] 0
Discussion
The function IsCollinear2D also reveals if three points are collinear.
765
766 ptscol.nb
In[2]: IsCollinear2D@
p1 = Point2D@3 a, 0D,
p2 = Point2D@0, 3 bD,
p3 = Point2D@a, 2 bDD
Out[2] True
6
5
4
3
2
1
0
-1 0 1 2 3 4 5 6
radaxis.nb
Approach
Convert the equations to circles and find the radical axis of the circles.
Solution
Construct the circles from the equations.
a b 1 è!!!!!!!!!!!!!!!!!!!!!! b a 1 è!!!!!!!!!!!!!!!!!!!!!!
Out[1] 9Circle2DA9− , − =, a2 + b2 − 4 c E, Circle2DA9− , − =, a2 + b2 − 4 c E=
2 2 2 2 2 2
Out[3] x − y == 0
767
768 radaxis.nb
Discussion
This is a plot of a numerical example with a = 1, b = 5 and c = −1.
2
0
-2
-4
-4 -2 0 2
radcntr.nb
Radical Center
Exploration
Prove that the radical axes of three circles taken in pairs intersect in a common point. This
point is called the radical center of the three circles.
Approach
Create the three radical axes, intersect them in pairs and show that the coordinates of the
points of intersection are equal.
Solution
Create three general circles.
In[1]: Clear@h1, k1, r1, h2, k2, r2, h3, k3, r3D;
C1 = Circle2D@8h1, k1<, r1D;
C2 = Circle2D@8h2, k2<, r2D;
C3 = Circle2D@8h3, k3<, r3D;
769
770 radcntr.nb
Discussion
This is the plot of a numerical example.
In[5]: Sketch2D@8C1, C2, C3, L12, L13, L23, p1, p2, p3< ê.
8h1 −> −2, k1 −> 0, r1 −> 1,
h2 −> 3, k2 −> 3, r2 −> 1.5,
h3 −> 5, k3 −> −2, r3 −> 2<,
CurveLength2D −> 14D;
6
4
2
0
-2
-4
-6
-6-4-2 0 2 4 6
raratio.nb
d2 + r12 − r22
d2 − r12 + r22
Approach
Create the two circles in a simplified, but sufficiently general, position. Construct the radical
axis and intersect it with the line segment between the centers. Inspect the appropriate ratio.
Solution
Create the two circles, one with center at the origin, the other with center at (d, 0).
Intersect the radical axis with the x-axis to find the point of division.
771
772 raratio.nb
d2 + r12 − r22
Out[3] Point2DA9 , 0=E
2d
"######################
Hd2 +r12 −r22 L2
Out[4]
d 2
"######################
Hd2 −r12 +r22 L2
d2
Since all the expressions under the radical are positive, we can simplify the radicals.
d2 + r12 − r22
Out[5]
2
d2 − r1 + r2
2
reccir.nb
Reciprocal of a Circle
Exploration
Given a circle C1 ≡ (x − h)2 + (y − k)2 = r2 show that its polar reciprocal in the auxiliary
conic x2 + y 2 = 1 is given by the quadratic
Q ≡ r2 − h2 x2 − 2hkxy + r2 − k 2 y 2 + 2hx + 2ky − 1 = 0.
Furthermore, show that Q is an ellipse if the origin (0, 0) is inside C; a parabola, if the origin
is on C; and a hyperbola, if the origin is outside C.
Approach
Create a general circle and the auxiliary conic. Construct five points on the circle. Construct
five tangent lines at the points. Construct reciprocals of the lines (five points). Construct a
quadratic through five points. Examine the discriminant of the quadratic.
Solution
Create a general circle and an auxiliary circle.
In[1]: Clear@h, k, rD;
cir1 = Circle2D@8h, k<, rD;
c1 = Circle2D@80, 0<, 1D;
773
774 reccir.nb
Determine the tangent lines at the points. This result was computed using Mathematica
Version 3.0.1. Version 4.0 computes a simpler result that is algebraically equivalent to this
one.
In[3]: lns1 = Map@Line2D@#, cir1D&, ptsD êê Simplify
In[4]: Reciprocal2D@
Line2D@A1_, B1_, C1_D,
Circle2D@80, 0<, 1DD :=
Point2D@8−A1 ê C1, −B1 ê C1<D;
è!!! è!!!
1 2 2
Out[5] 9Point2DA9 , 0=E, Point2DA9 , =E,
h+r è!!! è!!!
2 h+ 2 k+2r 2 h+ 2 k+2r
è!!! è!!!
1 1 1
Point2DA90, =E, Point2DA9 , 0=E, Point2DA90, =E=
k+r h−r k−r
Discussion
Examine the discriminant, d.
In[7]: disc1 = q1@@2DD ^ 2 − 4 ∗ q1@@1DD ∗ q1@@3DD êê Simplify
If d < 0 the quadratic is an ellipse and (0, 0) is inside the circle; if d = 1 the quadratic is a
parabola and (0, 0) is on the circle; and if d > 1 the quadratic is a hyperbola and (0, 0) is
outside the circle.
recptln.nb
Approach
Create the auxiliary conic, C. The pole point is the reciprocal of the line. The polar line is
the reciprocal of the point.
Solution
Define the auxiliary conic (circle), C.
In[1]: c1 = Circle2D@80, 0<, 1D;
A1 B1
Out[2] Point2DA9− , − =E
C1 C1
775
recquad.nb
Reciprocal of a Quadratic
Exploration
Given the general quadratic Q = ax2 + bxy + cy 2 + dx + ey + f = 0, show that the reciprocal
of Q in C is the quadratic
(4cf − e2 )x2 + (2de − 4bf ) xy + 4af − d2 y 2 +
(4cd − 2be) x + (4ae − 2bd) y + 4ac − b2 = 0
Approach
Create a general conic, Q, and the auxiliary conic. Construct a point P1 (x1 , y1 ), assumed to
be on Q. Construct the tangent line, L, at P1 . Take the reciprocal of L with respect to C,
producing P2 . Show that P2 is on the postulated quadratic.
Solution
Create a general quadratic.
777
778 recquad.nb
d + 2 a x1 + b y1 e + b x1 + 2 c y1
Out[5] Point2DA9− , − =E
2 f + d x1 + e y1 2 f + d x1 + e y1
Construct a polynomial.
In[7]: eq1 = Polynomial2D@q2, Coordinates2D@p2DD êê Together
1
Out[7] −
2 H4 Hc d f − b d e f + a e f + b f − 4 a c f + c d x1 − b d e x1 +
2 2 2 2 2 3 2
H2 f + d x1 + e y1L
a d e2 x1 + b2 d f x1 − 4 a c d f x1 + a c d2 x12 − a b d e x12 + a2 e2 x12 + a b2 f x12 −
4 a2 c f x12 + c d2 e y1 − b d e2 y1 + a e3 y1 + b2 e f y1 − 4 a c e f y1 +
b c d2 x1 y1 − b2 d e x1 y1 + a b e2 x1 y1 + b3 f x1 y1 − 4 a b c f x1 y1 +
c2 d2 y12 − b c d e y12 + a c e2 y12 + b2 c f y12 − 4 a c2 f y12LL
Ignore the denominator and the constant (the numerator will be shown to be zero).
In[8]: eq2 = Numerator@eq1D@@2DD
Out[8] c d2 f − b d e f + a e2 f + b2 f2 − 4 a c f2 + c d3 x1 − b d2 e x1 + a d e2 x1 + b2 d f x1 −
4 a c d f x1 + a c d2 x12 − a b d e x12 + a2 e2 x12 + a b2 f x12 − 4 a2 c f x12 + c d2 e y1 −
b d e2 y1 + a e3 y1 + b2 e f y1 − 4 a c e f y1 + b c d2 x1 y1 − b2 d e x1 y1 + a b e2 x1 y1 +
b3 f x1 y1 − 4 a b c f x1 y1 + c2 d2 y12 − b c d e y12 + a c e2 y12 + b2 c f y12 − 4 a c2 f y12
Factor.
In[9]: eq3 = Factor@eq2D
Out[10] 0
reflctpt.nb
Reflection in a Point
Exploration
A point P 0 (x0 , y 0 ) is said to be the reflection of a point P (x, y) in the point C(H, K) if C is
the midpoint of the segment P P 0 . Using this definition show the following.
A. The transformation equations for a reflection in a point are
x0 = 2H − x and x = 2H − x0 ;
y 0 = 2K − y and y = 2K − y 0 ;
ax + by − (2aH + 2bK + c) = 0;
Also, verify that the reflection in a point transformation is equivalent to a rotation of π radians
about the reflection point (H, K).
Approach
Solve the midpoint relationship for the coordinates of the transformation. Substitute the
reflected coordinates into the equation of a line to produce a reflected line. Substitute the
reflected coordinates into the equation of a quadratic to produce the reflected quadratic. Apply
the proposed rotation to show it is equivalent to the reflection.
779
780 reflctpt.nb
Solution
(H, K) is the midpoint of P P 0 . Solve for (x, y) and (x0 , y 0 ). This is the solution to proposition
A.
In[1]: Clear@x, y, x1, y1, H, KD;
88Solve@Hx + x1L ê 2 == H, x1D,
Solve@Hy + y1L ê 2 == K, y1D<,
8Solve@Hx + x1L ê 2 == H, xD,
Solve@Hy + y1L ê 2 == K, yD<<
Out[2] Line2D@a, b, −c − 2 a H − 2 b KD
Out[3] Quadratic2D@a, b, c, −d − 4 a H − 2 b K, −e − 2 b H − 4 c K,
f + 2 d H + 4 a H2 + 2 e K + 4 b H K + 4 c K2D
The reflection is the same as the specified rotation. This is the solution to the final proposition.
In[4]: Rotate2D@8x, y<, Pi, 8H, K<D
Out[4] 82 H − x, 2 K − y<
rtangcir.nb
Approach
Find the parametric coordinates of the points that define the angle and use the Pythagorean
Theorem to show they form a right angle.
Solution
Create a circle at the origin.
In[1]: Clear@rD;
C1 = Circle2D@80, 0<, rD;
Construct the points on the semicircle. P1 and P3 are the end points of the semicircle, P2 is
the (right) angle vertex.
In[2]: Clear@tD;
P1 = C1@0D;
P2 = C1@tD;
P3 = C1@PiD;
Apply the Pythagorean Theorem. First compute a2 + b2 and then show it is equal to c2 and
independent of the parameter value of the vertex point (it turns out that it is a function of
the circle’s radius only).
In[3]: 8Distance2D@P1, P2D ^ 2 + Distance2D@P2, P3D ^ 2,
Distance2D@P1, P3D ^ 2< êê Simplify
781
rttricir.nb
Exploration
Show that if r is the radius of a circle inscribed in a right triangle with sides a and b and
hypotenuse c, then r = (a + b − c) /2.
Approach
Position the triangle so that the sides of length a and b align with the x- and y-axes and the
vertex opposite the hypotenuse is at the origin. Create the circle inscribed in this triangle and
examine its radius.
Solution
The radius of the inscribed circle is found here.
"##########################################################################################
è!!!!! è!!!!! è!!!!! è!!!!!!!!!!!!! è!!!!! è!!!!!!!!!!!!!#
a2 + b2 + a2 b2 − a2 a2 + b2 − b2 a2 + b2
Out[1]
è!!!
2
783
784 rttricir.nb
In[2]: Clear@cD;
r2 = r1 êê. 8
Sqrt@a ^ 2D −> a,
Sqrt@b ^ 2D −> b,
Sqrt@c ^ 2D −> c,
a ^ 2 + b ^ 2 −> c ^ 2< êê Simplify
è!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ha − cL Hb − cL
Out[2]
è!!!
2
Since r2 and r are clearly positive we can square each of them and compare the squared values
for equality.
In[3]: r2 ^ 2 êê Expand
ab ac bc c2
Out[3] − − +
2 2 2 2
In[4]: r = Ha + b − cL ê 2;
Expand@r ^ 2D ê. b ^ 2 −> c ^ 2 − a ^ 2 êê Expand
ab ac bc c2
Out[4] − − +
2 2 2 2
shoulder.nb
where PM (xM , yM ) is the midpoint of the conic arc’s chord and has coordinates
x0 + x1 y0 + y1
xM = and yM = .
2 2
Approach
Create the conic arc and construct the point at parameter t = 1/2.
Solution
Create the conic arc.
In[1]: Clear@x0, y0, xA, yA, x1, y1, pD;
ca1 = ConicArc2D@8x0, y0<, 8xA, yA<, 8x1, y1<, pD;
1 1
Out[2] Point2DA9 Hx0 − p x0 + x1 − p x1 + 2 p xAL, Hy0 − p y0 + y1 − p y1 + 2 p yAL=E
2 2
785
786 shoulder.nb
1 1
Out[3] Point2DA9 Hx0 − p x0 + x1 − p x1 + 2 p xAL, Hy0 − p y0 + y1 − p y1 + 2 p yAL=E
2 2
Out[4] True
stewart.nb
Stewart’s Theorem
Exploration
C
b a
d
A B
m D n
AB = c
Show that for any 4ABC as shown in the figure the relationship between the lengths of the
labeled line segments is given by
a2 m + b2 n = c(d2 + mn).
Approach
Without loss of generality, place the triangle in a convenient position and use the distance
formula repeatedly to verify the relationship.
Solution
Create points A, B, C and D in a convenient position.
In[1]: Clear@c, m, x, yD;
ptA = Point2D@80, 0<D;
ptB = Point2D@8c, 0<D;
ptC = Point2D@8x, y<D;
ptD = Point2D@8m, 0<D;
787
788 stewart.nb
Out[3] 0
tancir1.nb
2 2
(x − h2 ) + (y − k2 ) = r22
are given by
r = |d ± r2 |
where
q
2 2
d= (h1 − h2 ) + (k1 − k2 ) .
Approach
Fix the center point using the equations h = h1 and k = k1 . The circles are tangent if
2 2
(d − (r2 − r)) (d − (r2 + r)) = 0
q
2 2
where d = (h1 − h2 ) + (k1 − k2 ) . Solve the three equations for r.
Solution
Solve the three equations.
789
790 tancir1.nb
Assuming d > 0 and r2 > 0: (1) r = −d − r2 is always negative, hence invalid; (2) r = d − r2
is positive if d > r2 , i.e. (h1 , k1 ) is outside circle c2 ; (3) r = −d + r2 is positive if d < r2 , i.e.
(h1 , k1 ) is inside circle c2 ; and (4) r = d + r2 is always positive and valid.
tancir2.nb
Exploration
Show that the centers (h, k) of the two circles passing through the point (x1 , y1 ) with center
on the circle x2 + y 2 = 1 and radius r = 1 are given by
p p !
x1 y1 4 − d21 y1 x1 4 − d21
(h, k) = ± , ∓
2 2d1 2 2d1
q
where d1 = x21 + y12 . This is a special case of TangentCircles2D[{obj}, ln | cir, r], where
the object is a point.
Approach
The radius is given, r = 1, so the center point (h, k) needs to be found. The equation
(x1 − h)2 + (y1 − k)2 = 1 is formed noting that the given point is on the circle. The equation
h2 + k 2 = 1 is formed noting that the center is on this circle. Solve two equations in two
unknowns.
Solution
Solve the two equations.
791
792 tancir2.nb
Simplify. Without loss of generality, assume all the point coordinates are positive.
In[2]: Clear@E1D;
ans2 = ans1 êê. 8
x1 ^ 2 ∗ y1 + y1 ^ 3 −> y1 ∗ d1 ^ 2,
x1 ^ 2 + y1 ^ 2 −> d1 ^ 2,
Sqrt@d1 ^ 2 ∗ E1_D −> d1 ∗ Sqrt@E1D,
Sqrt@x1 ^ 2 ∗ E1_D −> x1 ∗ Sqrt@E1D< êê FullSimplify
è!!!!!!!!!!!!!2 è!!!!!!!!!!!!!2
d13 − 4 − d1 x1 y1 − d1 y12 4 − d1 x1 + d1 y1
Out[2] 99h → , k → =,
2 d1 x1 2 d1
è!!!!!!!!!!!!! è!!!!!!!!!!!!!
d13 + 4 − d12 x1 y1 − d1 y12 − 4 − d12 x1 + d1 y1
9h → , k → ==
2 d1 x1 2 d1
è!!!!!!!!!!!!!2 è!!!!!!!!!!!!!2
x1 4 − d1 y1 4 − d1 x1 y1
Out[4] 99h → − , k → + =,
2 2 d1 2 d1 2
è!!!!!!!!!!!!!2 è!!!!!!!!!!!!!2
x1 4 − d1 y1 4 − d1 x1 y1
9h → + , k → − + ==
2 2 d1 2 d1 2
tancir3.nb
Exploration
Show that the centers (h, k) of the four circles tangent to the perpendicular lines
A1 x + B1 y = 0 and − B1 x + A1 y = 0
(A1 − B1 , A1 + B1 ),
(A1 + B1 , −A1 + B1 ),
(−A1 − B1 , A1 − B1 ),
(−A1 + B1 , −A1 − B1 ).
Approach
2 2
A circle (x − h) + (y − k) = r2 tangent to a line Ax + By + C = 0 implies that
2
A2 + B 2 r2 = (Ah + Bk + C)
giving two equations. The fixed radius r = 1 is a third equation. Solve three equations in
three unknowns.
793
794 tancir3.nb
Solution
Solve the three equations.
−A1 − B1 A1 − B1 A1 − B1 A1 + B1
Out[1] 99h → −
2 , k → −
2 , r → 1=, 9h → −
2 , k → −
2 , r → 1=,
A1 + B1
2 2
A1 + B1 2
A1 + B1 2
A1 + B1
−A1 + B1 −A1 − B1 A1 + B1 −A1 + B1
9h → − , k → − , r → 1=, 9h → − , k → − , r → 1==
A12 + B12 A12 + B12 A12 + B12 A12 + B12
Simplify.
In[2]: ans2 = ans1 êê. A1 ^ 2 + B1 ^ 2 −> 1
Out[2] 88h → A1 + B1, k → −A1 + B1, r → 1<, 8h → −A1 + B1, k → −A1 − B1, r → 1<,
8h → A1 − B1, k → A1 + B1, r → 1<, 8h → −A1 − B1, k → A1 − B1, r → 1<<
tancir4.nb
Exploration
Show that the radii of the two circles passing through the points (0, a) and (0, −a) with centers
on the circle x2 + y 2 = r22 are both given by
q
r= a2 + r22 .
This is a special case of TangentCircles2D[{obj1, obj2 }, line | circle] where the two objects
are points.
Approach
Two equations can be formed using the fact that points (0, a) and (0, −a) are on the circle.
A third equation can be formed since the center is on a given circle. Solve three equations in
three unknowns.
Solution
Solve three equations in three unknowns. The solutions with negative radii are invalid and
discarded.
795
796 tancir4.nb
"###########################################
Out[1] 99r → − c2 + r22 − 2 c x + x2 + y2 , h → −r2, k → 0=,
"###########################################
9r → − c2 + r22 − 2 c x + x2 + y2 , h → r2, k → 0=,
"###########################################
9r → c2 + r22 − 2 c x + x2 + y2 , h → −r2, k → 0=,
"###########################################
9r → c2 + r22 − 2 c x + x2 + y2 , h → r2, k → 0==
tancir5.nb
Approach
2 2
A line ax + by + c = 0 is tangent to a circle (x − h) + (y − k) = r2 if the equation
2
a2 + b2 r2 = (ah + bk + c)
holds. Form three equations in three unknowns from this equation and solve.
Solution
Solve three equations in three unknowns.
In[1]: Clear@r, h, k, A1, B1, C1D;
ans1 = Solve@8r ^ 2 == h ^ 2,
r ^ 2 == k ^ 2,
r ^ 2 == HA1 ∗ h + B1 ∗ k + C1L ^ 2<,
8h, k, r<D ê.
8A1 ^ 2 + B1 ^ 2 −> 1<;
797
798 tancir5.nb
C1 C1 C1 C1 C1
Out[2] 9− , , − , , − ,
−1 + A1 − B1 −1 + A1 − B1 1 + A1 − B1 1 + A1 − B1 −1 + A1 + B1
C1 C1 C1
, − , =
−1 + A1 + B1 1 + A1 + B1 1 + A1 + B1
In[3]: Clear@E1D;
ans3 = ans2 êê. Times@−1, Power@E1_, −1D, C1D :>
Times@Power@Expand@−E1D, −1D, C1D
C1 C1 C1 C1 C1
Out[3] 9 , , , , ,
1 − A1 + B1 −1 + A1 − B1 −1 − A1 + B1 1 + A1 − B1 1 − A1 − B1
C1 C1 C1
, , =
−1 + A1 + B1 −1 − A1 − B1 1 + A1 + B1
C1 C1 C1 C1 C1
Out[4] 9 , − , − , , ,
1 − A1 + B1 1 + A1 − B1 1 − A1 + B1 1 + A1 − B1 1 − A1 − B1
C1 C1 C1
− , − , =
1 + A1 + B1 1 − A1 − B1 1 + A1 + B1
Take the absolute value and return only the unique terms.
In[5]: Union@Abs@ans4DD
C1 C1 C1 C1
Out[5] 9AbsA E, AbsA E, AbsA E, AbsA E=
1 − A1 − B1 1 + A1 − B1 1 − A1 + B1 1 + A1 + B1
tancirpt.nb
Approach
The pole (point) of the line is the point of tangency.
Solution
Create the line, circle and pole point. This result was computed using Mathematica Version
3.0.1. Version 4.0 computes a different result that is algebraically equivalent. Both versions
produce the same final step.
In[1]: Clear@A1, B1, C1, h, k, rD;
p1 = Point2D@
l1 = Line2D@A1, B1, C1D,
c1 = Circle2D@8h, k<, rDD êê Simplify
A1 r2 B1 r2
Out[2] Point2DA9h − , k − =E
C1 + A1 h + B1 k C1 + A1 h + B1 k
799
tetra.nb
Exploration
A tetrahedron is a three-dimensional geometric object bounded by four triangular faces. Given
a tetrahedron with vertices O(0, 0, 0), A(a, 0, 0), B(0, b, 0) and C(0, 0, c) show that the areas
of the triangular faces are related by the equation
2 2 2 2
(AABC ) = (AAOB ) + (AAOC ) + (ABOC )
where Axyz is the area of the triangle whose vertices are x, y and z. Note the similarity to
the Pythagorean Theorem for right triangles.
Approach
Compute the area of 4ABC using Heron’s formula and compare it to the areas of the other
triangles.
Solution
Compute the semi-perimeter, s, of 4ABC.
1
Out[1] HAB + AC + BCL
2
Compute the areas of 4ABC using Heron’s formula. Replace the lengths of each side by
expressions in a, b and c, the coordinates on the axes.
801
802 tetra.nb
1 2 1 1 2 1
Out[2] − Ha2 + b2L + Ha2 + b2L Ha2 + c2L − Ha2 + c2L + Ha2 + b2L Hb2 + c2L +
16 8 16 8
1 1 2
Ha2 + c2L Hb2 + c2L − Hb2 + c2L
8 16
Approach
Construct an isosceles triangle whose sides are the given lengths. Construct the circle inscribed
in the triangle. The point of tangency between the first and second circle is at the parameter
θ = π/2 on the first circle. Construct a second triangle from the equal-length sides and a line
tangent to the first circle at the tangency point. The second circle can then be inscribed inside
the second triangle. Find and simplify the radius of the second inscribed circle.
Solution
Construct the isosceles triangle with the proper side lengths.
803
804 tncirtri.nb
è!!!!!!!!!!!!
!
b a2 − b2 2a
Out[2] Circle2DA9b, =, b $%%%%%%%%%%%%%%%%%%%%
−1 + E
a+b a+b
Construct the point of tangency between the first circle and the second.
j è!!!!!!!!!!!!!!!!!!!!!!!!!!!
i Ha − bL Ha + bL
!
2a y
z
Out[3] Point2DA9b, b j
j
j −1 + z
+ $%%%%%%%%%%%%%%%%%%%% z=E
j a+b a+b z z
k {
Construct the second triangle. The results are complicated, so we define and use some sim-
plification rules that are applied to the result.
In[4]: rules1 = 8
−1 + 2 a ê Ha + bL −> Ha − bL ê Ha + bL,
Sqrt@Ha − bL Ha + bLD ê Ha + bL −> Sqrt@Ha − bLD ê Sqrt@Ha + bLD,
Sqrt@Ha − bL ê Ha + bLD −> Sqrt@a − bD ê Sqrt@a + bD,
1 ê Sqrt@a ^ 2 − b ^ 2D −> 1 ê HSqrt@a − bD ∗ Sqrt@a + bDL,
Sqrt@a ^ 2 − b ^ 2D −> Sqrt@a − bD ∗ Sqrt@a + bD<;
L1 = Line2D@Segment2D@T1, 2, 3DD êê FullSimplify;
L2 = Line2D@Segment2D@T1, 1, 3DD êê FullSimplify;
T2 = Triangle2D@L1, L2, Line2D@P1, 0DD;
T2 = HT2 êê. rules1 êê SimplifyL êê. rules1
è!!!!!!!!! è!!!!!!!!!
è!!!!!!!!! è!!!!!!!!! 2ab 2 a−b b 2 b2 2 a−b b
Out[4] Triangle2DA9b, a − b a + b =, 9 ,
è!!!!!!!!! =, 9 ,
è!!!!!!!!! =E
a+b a+b a+b a+b
Construct the circle inscribed in the second triangle and find the radius. The results are
complicated, so we define and use some simplification rules that are applied to the result.
In[5]: rules2 = 8
Sqrt@a ^ 2 ∗ Ha − bL ^ 2 ê Ha + bL ^ 2D −> a Ha − bL ê Ha + bL,
Sqrt@Ha − bL ^ 2 ∗ b ^ 2 ê Ha + bL ^ 2D −> b Ha − bL ê Ha + bL,
Sqrt@Ha − bL ^ 3 ∗ b ^ 2 ê Ha + bL ^ 3D −> b ∗ Sqrt@Ha − bL ^ 3 ê Ha + bL ^ 3D<;
R2 = HHRadius2D@C2 = Circle2D@T2, Inscribed2DDD êê SimplifyL êê.
rules2 êê SimplifyL êê. rules2
Ha − bL3
Out[5] b $%%%%%%%%%%%%%%%%% 3
%
Ha + bL
Mathematica Version 3.0.1 produces the desired result in the previous step. Version 4.0 needs
the following additional step to produce the desired result. This step doesn’t change the
expression generated by Version 3.0.1.
tncirtri.nb 805
In[6]: R2 êê. 8
Sqrt@E1_ ∗ b ^ 2 ê HE2_L ^ 3D −> b ∗ Sqrt@E1 ê E2 ^ 3D,
Sqrt@E1_D :> Sqrt@Factor@E1DD<
Ha − bL3
Out[6] b $%%%%%%%%%%%%%%%%% 3
%
Ha + bL
Discussion
This is the plot of a numerical example with a = 10 and b = 3.5.
In[7]: Sketch2D@8T1, C1, P1, T2, C2< ê. 8a −> 10, b −> 3.5<D;
0
0 1 2 3 4 5 6 7
In[8]: Sketch2D@8T1, C1, P1, T2, C2< ê. 8a −> 10, b −> 6<D;
0
0 2 4 6 8 10 12
tnlncir.nb
x2 + y 2 + 2gx + 2f y + c = 0
x2 + y 2 + gx + f y = 0.
Approach
Create the circle from the given quadratic and construct the polar (line) of the origin with
respect to the circle. Intersect the polar with the circle to find P and Q. Construct a circle
through O, P and Q and find its equation.
Solution
Create the origin point and the circle from the given equation.
Out[2] Line2D@g, f, cD
807
808 tnlncir.nb
f "################
c #
c −
g "################
c #
c −
2 2
cg f2 +g2 cf f2 +g2
Out[3] 9Point2DA9−
2 −
è!!!!!!!!!!!!! , −
2 +
è!!!!!!!!!!!!! =E,
2 f +g f2 + g2
2 f +g f2 + g2
cg f "################ c2 #
c −
f2 +g2
cf g "################ c2 #
c −
f2 +g2
Point2DA9−
+
, −
−
! =E=
f2 + g2 è!!!!!!!!!!!!
f2 + g2
! f 2 + g 2 è!!!!!!!!!!!!
f2 + g2
g f 1 è!!!!!!!!!!!!
!
Out[4] Circle2DA9− , − =, f2 + g2 E
2 2 2
Out[5] g x + x2 + f y + y2 == 0
Discussion
Construct the circle related to x2 + y 2 − 6x − 4y + 12 = 0.
-2
-4 -4 -2 0 2 4
triallen.nb
Approach
Construct a triangle in a convenient, yet sufficiently general position. Then construct the
triangle’s altitude. Show that the length of p the altitude is given by the expression. Since the
length of each triangle side, sn , is positive, s2n = sn .
Solution
Construct a triangle with sides s1 , s2 and s3 . By default, the triangle’s first vertex is located
at the origin.
The length of the altitude is the distance from the triangle’s third vertex to the x-axis. This re-
sult was computed using Mathematica Version 3.0.1. Version 4.0 computes a slightly different
result that is algebraically equivalent.
809
810 triallen.nb
Altitude of a Triangle
Exploration
The altitude from vertex A of 4ABC is a line segment from A perpendicular to side BC (or
the extension of BC). Show that the equation of the line containing the altitude from A is
where the coordinates of the vertices are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ).
Approach
Construct the altitude and show that the line containing it is the line given.
Solution
Construct the line BC.
In[1]: Clear@x2, y2, x3, y3D;
BC = Line2D@8x2, y2<, 8x3, y3<D;
Out[2] Line2D@−x2 + x3, −y2 + y3, −x1 H−x2 + x3L + y1 Hy2 − y3LD
811
812 trialt.nb
Discussion
This defines a new function that constructs all the lines underlying the altitudes of a triangle.
In[4]: Altitudes2D@Triangle2D@8x1_, y1_<, 8x2_, y2_<, 8x3_, y3_<DD :=
8Altitude$2D@8x1, y1<, 8x2, y2<, 8x3, y3<D,
Altitude$2D@8x2, y2<, 8x3, y3<, 8x1, y1<D,
Altitude$2D@8x3, y3<, 8x1, y1<, 8x2, y2<D<;
Altitude$2D@8x1_, y1_<, 8x2_, y2_<, 8x3_, y3_<D :=
Line2D@x3 − x2, y3 − y2, −x1 Hx3 − x2L − y1 Hy3 − y2LD;
4
2
0
-2
-4
-4 -2 0 2 4
triarea.nb
a1 a2
V1 s3 V2
For the triangle illustrated in the figure, show that the area, A1 , associated with the AAS
(angle-angle-side) configuration whose parameters are a1 , a2 and s1 is given by
s21 sin(a2 ) sin(a1 + a2 )
A1 = .
2 sin(a1 )
Show that the area, A2 , associated with the ASA (angle-side-angle) configuration whose pa-
rameters are a1 , s3 and a2 is given by
s23 sin(a1 ) sin(a2 )
A2 = .
2 sin(a1 + a2 )
Show that the area, A3 , associated with the SAS (side-angle-side) configuration whose para-
meters are s1 , a2 and s3 is given by
s1 s3 sin(a2 )
A3 = .
2
Approach
Construct the triangle associated with each configuration, and then compute the expression
for the area and simplify.
813
814 triarea.nb
Solution
Construct the triangle for the AAS configuration.
Compute the area for the AAS configuration and simplify. The sine function is introduced to
prevent simplification back to the cosecant form.
Compute the area for the ASA configuration and simplify. The sine function is transformed
to lower case to prevent simplification back to the cosecant form.
"#########################
Out[5] Triangle2DA80, 0<, 8s3, 0<, 9s3 − s1 Cos@a2D, s12 Sin@a2D2 =E
1
Out[6] s1 s3 Sin@a2D
2
triarlns.nb
y = m1 x + c1 , y = m2 x + c2 and x = 0
is given by
2
(c1 − c2 )
A= q .
2
2 (m1 − m2 )
Approach
Create the triangle and compute the area.
Solution
Create the triangle.
In[1]: Clear@m1, c1, m2, c2D;
t1 = Triangle2D@Line2D@m1, −1, c1D,
Line2D@m2, −1, c2D,
Line2D@1, 0, 0DD
c1 − c2 −c2 m1 + c1 m2
Out[1] Triangle2DA9 , =, 80, c1<, 80, c2<E
−m1 + m2 −m1 + m2
c1 − c2 −c2 m1 + c1 m2
Out[2] 9Point2DA9 , =E, Point2D@80, c1<D, Point2D@80, c2<D=
−m1 + m2 −m1 + m2
815
816 triarlns.nb
In[3]: Clear@sD;
a = Distance2D@p1, p2D;
b = Distance2D@p2, p3D;
c = Distance2D@p3, p1D;
s = Ha + b + cL ê 2;
A1 = Sqrt@s Hs − aL Hs − bL Hs − cLD êê FullSimplify
1 Hc1 − c2L4
Out[3] $%%%%%%%%%%%%%%%%%%%%%%
2 Hm1 − m2L 2
2
Since (c1 − c2 ) is positive, the formula simplifies to the desired result.
Hc1 − c2L2
Out[4]
è!!!!!!!!!!!!!!!!!!!!
2 Hm1 − m2L2
tricent.nb
Centroid of a Triangle
Exploration
y PHa, bL
D
Dy
QHd, 0L x
x2 - x1
Show that the centroid of a triangle, as illustrated in the figure, is on a line at a distance
y = b/3 from the base of the triangle.
Approach
Place the triangle in a convenient position as shown in the figure. Create equations for the
moments of inertia of infinitesimal areas on either side of the centroid line. Use integration to
find the ordinate of the line.
Solution
Create lines for two sides of the triangle whose vertices are (0, 0), (d, 0) and (a, b).
817
818 tricent.nb
Construct a horizontal line at a general coordinate, y, which is the height of the centroid.
In[2]: Clear@yD;
L = Line2D@Point2D@0, yD, 0D;
The width of the triangle, W , is the difference between the abscissa of the intersection points
of the sides and the horizontal line.
In[3]: W = XCoordinate2D@Point2D@L, L2DD −
XCoordinate2D@Point2D@L, L1DD êê Simplify
dy
Out[3] d −
b
The moments of inertia on each side of the horizontal line must be equal.
In[4]: Clear@yBD;
Solve@Integrate@W ∗ HyB − yL, 8y, 0, yB<D ==
Integrate@W ∗ Hy − yBL, 8y, yB, b<D, yBD
b
Out[4] 99yB → ==
3
Discussion
Notice that the centroid only depends on the height of the triangle, b. The centroid’s height
does not depend on the horizontal location of the apex point, a, nor on the width of the base,
d.
tricev.nb
Exploration
Prove that the length of the altitude, h1 , from vertex V1 of a triangle to the opposite side of
the triangle (whose length is s1 ) is given by
√
PS
h1 =
2s1
Prove that the length of the angle bisector, b1 , from vertex V1 is given by
p
Ss2 s3 (−s1 + s2 + s3 )
b1 = .
s2 + s3
Also show that the formulas for the lengths of the cevians from vertices V2 and V3 can be
found by cyclic permutation of the subscripts given in the formulas above.
Approach
Construct a triangle with the given side lengths. Construct the associated cevians (altitude,
median and angle bisector) and compute and simplify the expressions for their lengths.
819
820 tricev.nb
Solution
Construct a triangle with the given side lengths and simplify.
In[1]: Clear@s, s1, s2, s3, S, P, e1D;
T = HTriangle2D@8s1, s2, s3<D êê FullSimplifyL ê.
Sqrt@−e1_ ê s_Symbol^ 2D −> Sqrt@−e1D ê s
The altitude of a triangle is the cevian perpendicular to the opposite side. These functions
return the length of the altitude (the height ) for each vertex, 1, 2 or 3. The perpendicular is
found by projecting the vertex on the line containing the opposite side.
In[2]: Height2D@Triangle2D@p1 : 8x1_, y1_<, p2 : 8x2_, y2_<, p3 : 8x3_, y3_<D,
n_ ê; Hn == 2 »» n == 3LD :=
Height2D@Triangle2D@p2, p3, p1D, n − 1D;
Compute the length of each altitude (the height) using the functions defined above and sim-
plify.
In[4]: HMap@Height2D@T, #D&, 81, 2, 3<D êê FullSimplifyL êê.
8Sqrt@−e1_ ê s_Symbol^ 2D −> Sqrt@−e1D ê s,
Sqrt@e1_ ê s_Symbol^ 2D −> Sqrt@e1D ê s,
s1 + s2 + s3 −> S,
Hs1 − s2 − s3L Hs1 + s2 − s3L Hs1 − s2 + s3L −> −P,
H−s1 + s2 − s3L Hs1 + s2 − s3L H−s1 + s2 + s3L −> −P,
Hs1 + s2 − s3L Hs1 − s2 + s3L H−s1 + s2 + s3L −> P<
è!!!!!! è!!!!!! è!!!!!!
PS PS PS
Out[4] 9 , , =
2 s1 2 s2 2 s3
The median of a triangle is the cevian connecting a vertex to the midpoint of the opposite
side. These functions return the length of the median for each vertex, 1, 2 or 3.
In[5]: Median2D@Triangle2D@p1 : 8x1_, y1_<, p2 : 8x2_, y2_<, p3 : 8x3_, y3_<D,
n_ ê; Hn == 2 »» n == 3LD :=
Median2D@Triangle2D@p2, p3, p1D, n − 1D;
Compute the length of each median using the functions defined above and simplify.
In[7]: Map@Median2D@T, #D&, 81, 2, 3<D êê FullSimplify
The angle bisector of a triangle is the cevian bisecting the angle of the vertex. These functions
return the length of the angle bisector for each vertex, 1, 2 or 3. Note that the angle bisector
must pass through the center of the inscribed circle.
Compute the length of each angle bisector using the functions defined above and simplify.
and
x1 y1 1
D = x2 y2 1
x3 y3 1
and the coordinates of the vertices are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ). This point is called
the orthocenter of the triangle.
Approach
From the exploration trialt.nb the altitude from vertex A of 4ABC to side BC (or the
extension of BC) is the line
where the coordinates of the vertices are A(x1 , y1 ), B(x2 , y2 ) and C(x3 , y3 ). Use this formula
to show that the three altitudes are concurrent and intersect one pair of the altitudes to find
the coordinates of the orthocenter.
823
824 triconn.nb
Solution
Define a function for constructing the altitude line of a triangle (the altitude from the first
vertex).
In[1]: Altitude2D@Triangle2D@8x1_, y1_<, 8x2_, y2_<, 8x3_, y3_<DD :=
Line2D@x3 − x2, y3 − y2, −x1 ∗ Hx3 − x2L − y1 ∗ Hy3 − y2LD
Show that they are concurrent by showing that the determinant of their coefficients is zero.
In[5]: Det@8List @@ lnA,
List @@ lnB,
List @@ lnC<D
Out[5] 0
Out[6] Point2DA
H−x2 Hx1 − x3L − y2 Hy1 − y3LL H−y2 + y3L − Hy1 − y3L H−x1 H−x2 + x3L − y1 H−y2 + y3LL
9
H−x2 + x3L Hy1 − y3L − Hx1 − x3L H−y2 + y3L
, H−H−x2 + x3L H−x2 Hx1 − x3L − y2 Hy1 − y3LL +
Hx1 − x3L H−x1 H−x2 + x3L − y1 H−y2 + y3LLL ê
HH−x2 + x3L Hy1 − y3L − Hx1 − x3L H−y2 + y3LL=E
triconn.nb 825
Hx1 x3 + y22L Hy1 − y3L − Hx2 x3 + y12L Hy2 − y3L − Hy1 − y2L Hx1 x2 + y32L
Out[7] Point2DA9 ,
−x2 y1 + x3 y1 + x1 y2 − x3 y2 − x1 y3 + x2 y3
Hx1 − x2L Hx32 + y1 y2L − Hx1 − x3L Hx22 + y1 y3L + Hx2 − x3L Hx12 + y2 y3L
=E
−x2 y1 + x3 y1 + x1 y2 − x3 y2 − x1 y3 + x2 y3
The x- and y-coordinates of the intersection point and the orthocenter are identical.
Discussion
This is the plot of a numerical example.
4
2
0
-2
-4
-4 -2 0 2 4
tridist.nb
Approach
Without loss of generality, create a triangle in a convenient position with the right angle
vertex at the origin and the other two vertices at (a, 0) and (0, b). Create the midpoint of the
hypotenuse and then examine the distance from the midpoint to each of the vertices.
Solution
Create the points defining the triangle’s vertices.
a b
Out[2] Point2DA9 , =E
2 2
The distances from the midpoint to the vertices are equal by inspection.
In[3]: Map@Distance2D@P, #D&, 8p1, p2, p3<D
a2 b2 a2 b2 a2 b2
+ , $%%%%%%%%%%%%%%%%%
Out[3] 9$%%%%%%%%%%%%%%%%% + , $%%%%%%%%%%%%%%%%%
+ =
4 4 4 4 4 4
827
828 tridist.nb
Discussion
This is the plot of a numerical example.
1.5
0.5
0
0 0.5 1 1.5 2 2.5 3
trieuler.nb
Exploration
If T is a triangle, and P and r are the center and radius of the circle inscribed in T , and Q
and R are the center and radius of the circle circumscribing T , show that
d2 = R2 − 2rR
Approach
Construct the required geometry using a triangle in a special, but sufficiently general, position.
Show the equation is true by showing that the difference of the left and right side of the
equation is identically zero.
Solution
Construct the required geometry and find symbolic expressions for d, r and R.
829
830 trieuler.nb
2
In this step we take a slight diversion to show that b2 + a − a2 − b2 = A2 B 2 . We will use
this substitution in a subsequent step. Variables A and B are the lengths of the sides of the
2
triangle, that is a2 + b2 = A2 and (1 − a) + b2 = B 2 .
Out[2] A2 B2
The expression d2 − R2 − 2rR should be zero if the equation d2 = R2 − 2rR is true, so we
will apply a series of simplifications√to show that the expression is identically zero. Notice
throughout expressions of the form Z 2 = Z whenever Z is known to be positive.
In[3]: e1 = d ^ 2 − HR ^ 2 − 2 ∗ r ∗ RL êê. 8
a ^ 2 + b ^ 2 −> A ^ 2,
1 − 2 a + a ^ 2 + b ^ 2 −> H1 − aL ^ 2 + b ^ 2,
H1 − aL ^ 2 + b ^ 2 −> B ^ 2,
Sqrt@A ^ 2D −> A,
Sqrt@B ^ 2D −> B,
b ^ 2 + Ha − a ^ 2 − b ^ 2L ^ 2 −> A ^ 2 ∗ B ^ 2<
2
A2 B2 1 a+A 2
a − a2 − b2 b
Out[3] −
2 + J− + N + J + N +
4b 2 1+A+B 2b 1+A+B
H−1 + 1
H1 + A + BLL H−A + 1
H1 + A + BLL H−B +
A2 B2 $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
è!!! $%%%%%%%%%%%%
1
H1 + A + BLL
2
2 2 2
b2 1+A+B
Make substitutions to remove some of the radicals. S is the semi-perimeter of the triangle,
S = (1 + A + B) /2.
In[4]: Clear@SD;
e2 = e1 êê. 8
1 + A + B −> 2 ∗ S,
Sqrt@A ^ 2 ∗ B ^ 2 ê b ^ 2D −> A ∗ B ê b<
A2 B2 1 a+A 2
a − a2 − b2 b
2 A B "###############################
H−1+SL H−A+SL H−B+SL
Out[4] −
2 + J− + N + J + N +
S
4b 2 2S 2b 2S b
This is the crucial substitution. Using Heron’s formula for the area of a triangle,
p
Area = S(S − A) (S − B) (S − C)
In[5]: e3 = e2 êê. 8
Sqrt@H−1 + SL H−A + SL H−B + SL ê SD −> Area1 ê S,
Area1 −> b ê 2<
2
A2 B2 1 a+A 2
a − a2 − b2 b AB
Out[5] −
2 + J− + N + J + N +
4b 2 2S 2b 2S 2S
If the expression is a fraction, we don’t care what value the denominator is, so long as the
numerator is zero.
In[6]: e4 = Numerator@Together@e3DD
Out[6] a2 b2 + 2 a A b2 + A2 b2 + b4 − 2 a2 b2 S − 2 A b2 S − 2 b4 S + 2 A b2 B S + a2 S2 − 2 a3 S2 +
a4 S2 + b2 S2 − 2 a b2 S2 + 2 a2 b2 S2 + b4 S2 − A2 B2 S2
Repeated expansions and substitutions confirm that the expression is zero and that the original
equation is an identity.
In[7]: FixedPoint@
HExpand@H# êê. 8A ^ 2 −> a ^ 2 + b ^ 2,
B ^ 2 −> H1 − aL ^ 2 + b ^ 2,
S −> H1 + A + BL ê 2,
A ^ 4 −> Ha ^ 2 + b ^ 2L ^ 2<LDL&,
e4D
Out[7] 0
trirad.nb
Triangle Radii
Exploration
Prove that the radius, r, of a circle inscribed in a triangle is given by
r
1 P
r=
2 S
where S = s1 + s2 + s3 , P = (−s1 + s2 + s3 ) (s1 − s2 + s3 ) (s1 + s2 − s3 ) and s1 , s2 and s3
are the lengths of the triangle’s sides. Furthermore, prove that the radius, R, of the circle
circumscribing the triangle is given by
s1 s2 s3
R= √ .
PS
Approach
Construct a triangle with the given side lengths. Construct the associated inscribed and
circumscribed circles and examine the radius of these circles.
Solution
Construct the triangle with the given side lengths.
In[1]: Clear@s1, s2, s3, S, P, e1, e2D;
T = HTriangle2D@8s1, s2, s3<D êê FullSimplifyL êê.
8Sqrt@−e1_ ê s_Symbol^ 2D :> Sqrt@−e1D ê s<
Construct the inscribed circle and compute its radius. Simplify the resulting expression using
appropriate substitutions.
833
834 trirad.nb
"####
P#
S
Out[2]
2
Construct the circumscribed circle and compute its radius. Simplify the resulting expression
using appropriate substitutions.
s1 s2 s3
Out[3]
è!!!!!!
PS
trisides.nb
Approach
Construct a triangle with the formulas given for the side lengths and show that the altitude
lengths are h1 , h2 and h3 .
Solution
Construct the triangle with the given side lengths.
Compute the lengths of each altitude (squared), which is the distance from the vertex to the
opposite side.
835
836 trisides.nb
In[2]: alts1 = 8
Distance2D@Point2D@T, 1D, Line2D@T, 2, 3DD ^ 2,
Distance2D@Point2D@T, 2D, Line2D@T, 1, 3DD ^ 2,
Distance2D@Point2D@T, 3D, Line2D@T, 1, 2DD ^ 2< êê FullSimplify
2
h14 H18 + Hh22 H24 − h32 H34L − 2 h12 H14 Hh22 H24 + h32 H34L
Out[2] 9−
2 4 ,
H2 h1 H1
2
h14 H18 + Hh22 H24 − h32 H34L − 2 h12 H14 Hh22 H24 + h32 H34L
−
,
H2 h22 H24
2
h14 H18 + Hh22 H24 − h32 H34L − 2 h12 H14 Hh22 H24 + h32 H34L
−
=
H2 h32 H34
A few substitutions verify that the altitude lengths (squared) are the expected values.
In[3]: alts2 =
alts1 êê. 8H1 −> h2 ∗ h3, H2 −> h1 ∗ h3, H3 −> h1 ∗ h2< êê FullSimplify êê Factor
1
Out[3] 9−
2 Hh1 Hh1 h2 − h1 h3 − h2 h3L
2
H
Hh1 h2 + h1 h3 − h2 h3L Hh1 h2 − h1 h3 + h2 h3L Hh1 h2 + h1 h3 + h2 h3LL,
1
−
Hh22 Hh1 h2 − h1 h3 − h2 h3L
H2
Hh1 h2 + h1 h3 − h2 h3L Hh1 h2 − h1 h3 + h2 h3L Hh1 h2 + h1 h3 + h2 h3LL,
1
Hh32 H−h1 h2 − h1 h3 + h2 h3L Hh1 h2 − h1 h3 + h2 h3L H−h1 h2 + h1 h3 + h2 h3L
−
H2
Hh1 h2 + h1 h3 + h2 h3LL=
In[4]: alts3 = alts2 êê. 8h2 ∗ h3 −> H1, h1 ∗ h3 −> H2, h1 ∗ h2 −> H3<
Epilogue
Installation Instructions
To make full use of the files provided on the CD-ROM, two software applications need to be
installed on your computer: Adobe’s Acrobat Reader and Wolfram Research’s Mathematica.
Acrobat Reader is used to view and print the PDF (Portable Document Format) files on the
CD-ROM. The PDF files contain typeset text reproducing all the material in the book Ex-
ploring Analytic Geometry with Mathematica. Mathematica is used to view the notebook files
and execute the Descarta2D packages. If Mathematica is not available, Wolfram Research’s
MathReader application may be used to view the notebook files, although the Descarta2D
packages cannot be interactively executed using MathReader.
839
840 Installation Instructions
Mathematica are provided with Mathematica itself. Mathematica should be installed before
installing the Descarta2D files provided on the CD-ROM.
If Mathematica is not installed on your computer system, you can still view the contents
of the notebook files on the CD-ROM using Wolfram’s MathReader application (notebook
files have the extension .nb). MathReader is also a licensed product of Wolfram Research
Incorporated. It is available as a free download from Wolfram’s web site, www.wolfram.com.
For Windows systems, a version of MathReader is provided on the CD-ROM and may be
installed by double-clicking the Setupex.exe file icon in the MathReader folder on the CD-
ROM. If Mathematica is installed on your computer system, do not install the MathReader
software. Mathematica provides all the capabilities of MathReader.
By using Mathematica or MathReader you can view any notebook file directly off the
CD-ROM. However, it is recommended that you install the files in the folder Descarta2D as
described in the next section prior to viewing them. Generally, you will not be able to follow
the hyperlinks in the notebook files unless they are installed on your computer’s hard disk
drive as described in the next section.
Mathematica and MathReader will search this directory when trying to locate packages (.m
files) and notebook files (.nb files). In order to install Descarta2D and related documentation
so that Mathematica can find these files, copy the Descarta2D folder and all its contents from
the CD-ROM into the Applications folder of the directory path named above.
If you plan to use Descarta2D on a different operating system, refer to the installation in-
structions for your Mathematica system to determine the name of the proper directory path for
add-on applications. This information is also provided in Wolfram’s Mathematica book. For
example, the high-level directory name for Mathematica on a Macintosh is Mathematica 3.0.
On a Unix or NeXT system the high-level directory name is /usr/local/Mathematica3.0.
menu bar after the Descarta2D folder has been copied into the proper folder. After the help
index is rebuilt, the Descarta2D documentation and the notebooks representing this book can
be accessed by clicking the Add-ons radio button on the Help Browser dialog. The high-level
category name that opens access to the Descarta2D categories is Descarta2D.
Package Loading
In order to initialize the Descarta2D software in any Mathematica session enter the command
<<Descarta2D‘. This command will load the initialization file for Descarta2D and will enable
Mathematica to find and load any other Descarta2D package as it is needed.
Bibliography
[1] Bowyer, Adrian and John Woodwark, A Programmer’s Geometry, First Edition, Butter-
worths, London, UK, 1983.
[2] Bowyer, Adrian and John Woodwark, Introduction to Computing with Geometry, First
Edition, Information Geometers Ltd., Winchester, UK, 1993.
[3] Copland, Sr., Arthur H., Geometry, Algebra, and Trigonometry by Vector Methods, First
Edition, The Macmillan Company, New York, 1962.
[4] Dörrie, Heinrich, 100 Great Problems of Elementary Mathematics, Second Edition, Dover
Publications, Inc., New York, 1965.
[5] Eisenhart, Luther Pfahler, Coordinate Geometry, Dover Edition, Dover Publications, Inc.,
New York, 1960.
[6] Gasson, Peter C., Geometry of Spatial Forms, Revised Edition, Ellis Horwood Limited,
Chichester, West Sussex, England, 1983.
[7] Gellert W., H. Küster, M. Hellwich, H. Kästner (editors), The VNR Concise Encyclopedia
of Mathematics, First Edition, Van Nostrand Reinhold Company, New York, 1977.
[8] Gray, Alfred, Modern Differential Geometry of Curves and Surfaces, First Edition, CRC
Press, Boca Raton, Florida, 1993.
[9] Gullberg, Jan, Mathematics From the Birth of Numbers, First Edition, W. W. Norton &
Company, New York, 1997.
[10] Itô, Kiyosi (editor), Encyclopedic Dictionary of Mathematics, Second Edition, The MIT
Press, Cambridge, Massachusetts, 1987.
[11] Lee, Eugene T. Y., Gerald E. Farin (editor), Geometric Modeling: Algorithms and New
Trends, First Edition, Society for Industrial and Applied Mathematics, Philadelphia,
Pennsylvania, 1987.
[12] Lehmann, Charles H., Analytic Geometry, Third Printing, John Wiley & Sons, Inc., New
York, 1947.
843
844 Bibliography
[13] Meserve, Bruce E., Fundamental Concepts of Geometry, First Edition, Dover Publica-
tions, Inc., New York, 1983.
[14] Mortenson, Michael E., Geometric Modeling, First Edition, John Wiley & Sons, New
York, 1985.
[15] Oakley, C. O., An Outline of Analytic Geometry, First Edition, Barnes & Nobel, Inc.,
New York, 1949.
[16] Ogilvy, C. Stanley, Excursions in Geometry, First Edition, Oxford University Press, New
York, 1969.
[17] Peck, William G., An Treatise on Analytical Geometry, First Edition, A. S. Barnes &
Company, New York and Chicago, 1873.
[18] Pedoe, Dan, Geometry: A Comprehensive Course, Dover Edition, Dover Publications,
Inc., New York, 1988.
[19] Salmon, George, A Treatise on Conic Sections, Sixth Edition, Chelsea Publishing Com-
pany, New York, date unknown.
[20] Selby, Samuel M. (editor), Standard Mathematical Tables, Nineteenth Edition, The Chem-
ical Rubber Co., Cleveland, Ohio, 1971.
[21] Smith, Charles, An Elementary Treatise on Conic Sections by the Methods of Coordinate
Geometry, New Edition, Macmillan and Co., Limited, London, 1927.
[22] Smith, Edward S. and Meyer Salkover and Howard K. Justice, Analytic Geometry, Fifth
Edition, John Wiley & Sons, Inc., London, 1943.
[23] Smith, Percey F. and Arthur S. Gale and John H. Neelley, New Analytic Geometry,
Revised Edition, Ginn and Company, Boston, 1928.
[24] Thomas, Jr., George B., Calculus and Analytic Geometry, Alternate Edition, Addison-
Wesley Publishing Company, Inc., Reading, Massachusetts, 1972.
[25] Underwood, R. S. and Fred W. Sparks, Analytic Geometry, First Edition, Houghton
Mifflin Company, Boston, 1948.
[26] Weisstein, Eric W., CRC Concise Encyclopedia of Mathematics, First Edition, CRC Press
LLC, Boca Raton, Florida, 1999.
[27] Wells, David, The Penguin Dictionary of Curious and Interesting Geometry, First Edi-
tion, Penguin Books, London, England, 1991.
[28] Wolfram, Stephen, Mathematica, A System for Doing Mathematics by Computer, Second
Edition, Addison-Wesley Publishing Company, Inc., Redwood City, California, 1991.
Index
845
846 Index
variable
definition, 39
dependent, 39
independent, 39
vertex
parabola, 135
triangle, 117
vertex equation
ellipse, 187
hyperbola, 187
parabola, 186
Quadratic2D, 502
vertical
line, 61
vertices
ellipse, 146
hyperbola, 159
Vertices2D
Ellipse2D, 412
example, 151