This post is similar to an earlier post of mine about an artist drawing the letter A as a hole in line paper. Replicating that in Maple I have put in the 'too hard' basket for now. I decided to draw the capital letters of the alphabet. I started with the letter A, not just because it is the first letter, but that that I thought it was of intermediate difficulty. (...as well as having lady friends with names starting with B!:-)) Easier letters would be I and L. One can draw these using the polygon command. 'A' is harder as it has inner regions which must be catered for viz the triangle and trapezium base. There are about ten letters of the alphabet with curves: {B, D, P, R, S} and { J. G, C O }. They all have curved portions, but the former set have curves which "bulge out to the right", (with the possible exception of letter S.) I decided to dive in and tackle the letter B. I'd heard of Bezier curves and tried to learn about these. (More later). Owing to the bulging B, I decided I'd try to liken that part to an ellipse. I was not happy with the curvature, so tried modifying the equation, involving powers of 4. After quite a lot of time I managed to get the upper part of the letter B. There were difficulties in coloring the letter and I am indebted to Carl (Love aka DeVore) who I recalled mentioned about the order of displaying the various sections of the letter: that saved me hours of anguish! At this stage the resulting output was that of the letter D, and I was getting tired. I did a copy and paste of this code into the program below, to compare the output with my previous letter A. I was disappointed as the output for the D was almost non-existent. Initially I thought there may be differences in the values used for A and D and changed x0, y0 for x0D, y0D - but to no effect. The cut and paste section of D is between the # # # # .
The output of the rotated letter A, has 'worked' but it looks unusual - I'm not sure if I suffer from slight astigmatism, or there's a bug in my code! Comments on this please. I'm not expecting a close inspection of the code - that may be like finding a needle in a haystack. Any ideas as to why there is little output for D?.
Bezier Curves
Restarting from my previous comment on letters C. J etc these have curves which are orientated something akin to y=x^2 - or in maths lingo, their base curves can be represented by functions. I found sparse mention of Bezier curves on the Maple site, but there are many sites now describing how to construct these. I'll just constrict talk to quadratic Bezier curves. A Bez quad curve can be obtained by multiplying PMT - (nothing to do with women's problems!) - where (I think) P is a 1x3 row vector ( P0 P1 P2), M is a 3x3 matrix <1 -2 1, -2 2 0, 1 0 0> and T is a 3x1 column vector <t^2, t, 1> and 0<t<1.
On multiplying this out it comes to something like:
C(t) =(P0-2P1+P2)t^2+ (-2P0+2P1)t +P0
This is the equation of a quadratic, or parabola, but I'm not sure how to apply it:-( I believe the P are related to coords of "control points" , and when t=0 the parabolashould pass through one's begining point, and similarly when t=1 it should correspond to the end point of one's desired curve.
I'd appreciate some feedback on whether my ideas are correct. What are P0,P1,P2 ? Numbers, vectors? How are they related to the control points? ...and the coords of initial & last points of one's curve. It seems to me there is still a lot of trial and error work to do, but I suppose in a GUI environment the user is using a device to view the curve and can quickly choose the appropriate one.
Thanks for reading this long missive, and again any feedback is much appreciated.
David
restart:
# # # # # # # # # # # # # # # # # # # #
# Second attempt at the letter A: earlier working version was
# letterA_Art_trick.mws
# Functional operators. Use of ->
# to find coords of rotated points.
#To Do:
#Rotate Trig through phi
# " trapezL
# Orientation looks wrong
# Check - then put in a proc
# non-numeric vertex in trigArL
# # # # # # # # # # # # # # # # # # # #
with(plots):
with(plottools):
# Following are parameters for A : to later put in proc(...)
# phi rotates the A through that angle about the origin/
l:=12:w:=2:thet:=Pi/2.7:topl:=2:x0:=2:y0:=5:phi:=3*Pi/4:
h := (x, y) -> [x*cos(phi)-y*sin(phi), x*sin(phi)+y*cos(phi)]:
#Alist is list of coords for letter A
Alist:=[[x0,y0],[x0+l*cos(thet),y0+l*sin(thet)],[x0+l*cos(thet)+topl,y0+l*sin(thet)],[x0+2*l*cos(thet)+topl,y0], [x0+2*l*cos(thet)+topl-w,y0],[x0+5*l*cos(thet)/3+topl-w,y0+l*sin(thet)/3],[x0+l*cos(thet)/3+w,y0+l*sin(thet)/3], [x0+w,y0]]:
#outA:=polygon([[x0,y0],[x0+l*cos(thet),y0+l*sin(thet)],[x0+l*cos(thet)+topl,y0+l*sin(thet)],[x0+2*l*cos(thet)+topl,y0], [x0+2*l*cos(thet)+topl-w,y0],[x0+5*l*cos(thet)/3+topl-w,y0+l*sin(thet)/3],[x0+l*cos(thet)/3+w,y0+l*sin(thet)/3], [x0+w,y0]]):
#trigA is small inner triangle of letter A - not rotated
eps:=3*w/4:
corr:=.3*w:
#trigA:=polygon([[x0+(2*l*cos(thet)+topl)/2, #y0+l*sin(thet)-eps],[x0+w+(l/3+corr*w)*cos(thet), #y0+(l/3+corr*w)*sin(thet)],[x0+2*l*cos(thet)+topl-w-(l/3+corr*w)*cos(thet)#, y0+(l/3+corr*w)*sin(thet)]], color=white):
trigA_L:=[[x0+(2*l*cos(thet)+topl)/2, y0+l*sin(thet)-eps],[x0+w+(l/3+corr*w)*cos(thet), y0+(l/3+corr*w)*sin(thet)],[x0+2*l*cos(thet)+topl-w-(l/3+corr*w)*cos(thet), y0+(l/3+corr*w)*sin(thet)]]:
trigArL:=[]:
for i from 1 to 3 do
#Get coords from trigA_L
x:=trigA_L[i][1]:
y:=trigA_L[i][2]:
# Add coords to new rotated list trigAr
#L := [op(L),x[5]];
trigArL:=[op(trigArL), h(x,y)]:
end do:
#trigArL;
trigAr := polygon(trigArL, color=white, linestyle=1, thickness=1):
#plots[display](trigAr);
#Read coords of Alist into another list after first transforming the #coords using func op h. Angle of rot is phi. thet is inclination of #letter A
#Main Outline of letter - but NOT the convex hull
Alistr:=[]:
# h := (x, y) -> [x*cos(phi)-y*sin(phi), x*sin(phi)+y*cos(phi)]:
for i from 1 to 8 do
#Get coords from Alist
x:=Alist[i][1]:
y:=Alist[i][2]:
# Add coords to new rotated list Alistr
#L := [op(L),x[5]];
Alistr:=[op(Alistr), h(x,y)]:
end do:
l2 := polygon(Alistr, color=wheat, linestyle=1, thickness=1):
# # # # # # # # # # # # # # # # #
#plots[display](trigAr,l2);
#plots[display](trigAr,trapezL, l2);
#trigAr,
#thet:=Pi/3:
# Rotation by thet anti-clockwise about the origin
#h := (x, y) -> [x*cos(thet)-y*sin(thet), x*sin(thet)+y*cos(thet)]:
#h(sqrt(3), 1);
# To find a polygon (trapezium EFGH??) which is the shape of he base of A.
# This is necessary as this portion is colored same as rest of A.
#trapezr:=polygon([[(x0+2*l*cos(thet)+topl-w)*cos(phi)-y0*sin(phi),(x0+2*l*#cos(thet)+topl-w)*sin(phi)+y0*cos(phi)],[(x0+5*l*cos(thet)/3+topl-w)*cos(p#hi)-(y0+l*sin(thet)/3)*sin(phi),(x0+5*l*cos(thet)/3+topl-w)*sin(phi)+(y0+l#*sin(thet)/3)*cos(phi)],[(x0+l*cos(thet)/3+w)*cos(phi)-(y0+l*sin(thet)/3)*#sin(phi),(x0+l*cos(thet)/3+w)*sin(phi)+(y0+l*sin(thet)/3)*cos(phi)],[(x0+w#)*cos(phi)-y0*sin(phi),(x0+w)*sin(phi)+y0*cos(phi)]],color=white,filled=tr#ue, linestyle=DOT):
#trapezL is a list of coords of the base trapezium
#THESE coords have not been rotated. Repeat previous procedure to obtain #rotated coords
trapezr:=[]:
for i from 5 to 8 do
#Get coords from Alist
x:=Alist[i][1]:
y:=Alist[i][2]:
# Add coords to rotated list trapezr
trapezr:=[op(trapezr), h(x,y)]:
end do:
#trap2 := polygon(trapezr, color=wheat, linestyle=1, thickness=1):
#trapezL:=polygon([[x0+2*l*cos(thet)+topl-w,y0],[x0+5*l*cos(thet)/3+topl-w,y0+l*sin(thet)/3],[x0+l*cos(thet)/3+w,y0+l*sin(thet)/3], [x0+w,y0]], color=red):
trapezL:=polygon(trapezr, color=white):
# lbase is an unseen line at base of the trapezium of A. Colored white # as needed to be hidden
lbase:=line([(x0+2*l*cos(thet)+topl-w)*cos(phi)-y0*sin(phi),(x0+2*l*cos(thet)+topl-w)*sin(phi)+y0*cos(phi)], [(x0+w)*cos(phi)-y0*sin(phi),(x0+w)*sin(phi)+y0*cos(phi)], color=white):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Letter D (or top part of B!)
a := .6: b := .5: x0D := 1: y0D:=7:
c1:=15:n:=4:
pl1:=plot([x, y0D+b^2*sqrt(c1-(x-x0D)^n/a^2), x=1..2.6], scaling=constrained, color=wheat,filled=true):
pl2:=plot([x, y0D-b^2*sqrt(c1-(x-x0D)^n/a^2), x=1..2.6], scaling=constrained, color=red, filled=true): #was white
pl3:=plot([x, y0D+b^2*sqrt(c1/2-(x-x0D)^n/a^2), x=1.3..3], scaling=constrained, color=blue,filled=true): #was white
pl4:=plot([x, y0D-b^2*sqrt(c1/2-(x-x0D)^n/a^2), x=1.3..3], scaling=constrained,color=wheat, filled=true):
x:=1.3:
#Create & Draw inner up line of D
ylow:=eval(y0D-b^2*sqrt(c1/2-(x-x0D)^n/a^2)):
yhigh:=eval(y0D+b^2*sqrt(c1/2-(x-x0D)^n/a^2)):
l_up_in:=line([x,ylow], [x,yhigh], color=wheat):
#Create & Draw outer up line of D
x:=1:
ylow:=eval(y0D-b^2*sqrt(c1-(x-x0D)^n/a^2)):
yhigh:=eval(y0D+b^2*sqrt(c1-(x-x0D)^n/a^2)):
l_up_out:=line([x,ylow], [x,yhigh], color=white):
plots[display]( pl2,pl4,pl3,l_up_in,l_up_out,pl1, scaling=constrained, view=[1..2.6, 6..8.1]);
# removed l_up_in, before l_up_out - no difference
# # # # # # # # # # # # # # # # # # # # # # # # - End of letter D - # # # #
# Display letter A
plots[display](trigAr,lbase,trapezL, l2);