Today, weโre starting out on a new 3d graphics idea, talking about a PHP package named โImage_3Dโ written by Arne Nordmann, Tobias Schlitt and Kore Nordmann. You may recall an alternative 3d graphics idea called WebGL talked about with the thread of blog postings down from WebGL Prism Canvas Email Tutorial.
We installed โImage_3Dโ via the Pear PHP installer, but we shall talk more about that tomorrow. For today, it is more โproof of conceptโ territory, taking leads from the excellent Paint 3-D images with PHP resource we thank profusely.
So take a look at โฆ
Cone (metal) |
---|
Sphere (metal) |
Torus (metal) |
Cube (metal) |
โฆ and at this starting PHP conephpโs live
run (of a cone) link.
Previous relevant WebGL Prism Canvas Email Tutorial is shown below.
Today weโre revisiting our โConvex Polygon shape with an added dimension by displaying its 3D prism equivalent via the WebGL API scenarioโ, we last talked about with PHP and Javascript and CSS WebGL Prism Tutorial as shown below. We revisit with a view to โฆ
- make it more aesthetically pleasing, we hope
- centre the main graphical elements of the web application when unsupervised and avoid our old โsinfulโ align=โcenterโ โhabitโ usage we talked about at W3C XHTML Nu Checker Validation Primer Tutorial going on, which we diligently changed to style=โ width:100%;text-align:center; โ here today โฆ when unsupervised, but โฆ
- left justify the main graphical elements of the web application when supervised, so this involved detecting โsupervisionโ and Javascript DOM changes at โฆ
window.onload = function init() {
if (document.URL.indexOf('huh=') != -1 || parent.document.getElementById('glcanvas') != null || (document.referrer.indexOf('/HTMLCSS/ShapeDraw') != -1 && document.referrer.indexOf('.htm') == -1)) {
document.getElementById('myform').innerHTML+='<input type=hidden name=huh value=></input>';
document.getElementById('mydiv').style.position='absolute';
document.getElementById('mydiv').style.top='0px';
document.getElementById('mydiv').style.left='0px';
document.getElementById('mydiv').style.width='300px';
document.getElementById('mydiv').style.textAlign='left';
document.getElementById('mydiv').innerHTML='<canvas id="gl-canvas" width="300" height="300"></canvas>';
document.getElementById('mydiv2').style.position='absolute';
document.getElementById('mydiv2').style.top='310px';
document.getElementById('mydiv2').style.left='0px';
document.getElementById('mydiv2').style.textAlign='left';
document.getElementById('mydiv3').style.position='absolute';
document.getElementById('mydiv3').style.top='330px';
document.getElementById('mydiv3').style.left='0px';
document.getElementById('mydiv3').style.textAlign='left';
} else {
document.getElementById('mydiv').innerHTML='<canvas id="gl-canvas" width="400" height="400"></canvas>';
}
canvas = document.getElementById( "gl-canvas" );
// more follows ... - adding new Email functionality via mailto: tags linking to the userโs default Email client program, featuring the ability to โฆ
- have the body section of that email be able to have a clipboard image pasted into it, for which we can utilize HTML5 canvas elementโs toDataURL() method, teamed up with a window.open popup window of the toDataURL image data, which can be selected and copied, optionally, by the user themselves, should they wish this to make their email more self explanatory โฆ and that canvas elementโs โmeeting of mindsโ with WebGL changing as per โฆ
gl = WebGLUtils.setupWebGL( canvas, {preserveDrawingBuffer:true} );
โฆ the help for which we got great ideas from this useful link, thanks, and which allows the canvas element content to be retained long enough to be available for the toDataURL() call of it
As weโve said before about email, as a communication tool, its use can add a lot of accountability to your web applications, as well as being a great โsharingโ method.
So please feel free to try โฆ
- an unsupervised live
run
- a supervised live
run
- HTML and Javascript and CSS (supervised) webgl_test
html โฆ
- changed in thisway โฆ
- PHP (supervisor) ShapeDraw
php is unchanged
- see todayโs tutorial picture up close
When will we see you โฆ again โฆ da, da da, da da?
Previous relevant PHP and Javascript and CSS WebGL Prism Tutorial is shown below.
To infinity and beyond!! โฆ well, at least to the 3rd dimension โฆ yes, weโre rejoining our Geometry and Land Surveying theme today, rejoining the discussion of PHP and Javascript and CSS Shape Rotation Tutorial as shown below, but giving some additional functionality to show the Convex Polygon shape with an added dimension by displaying its 3D prism equivalent via the WebGL API, modelling the additional code via the public generosity and wonderful resources from the University of New Mexico โฆ our heartfelt thanks.
If you have been a recent reader youโll have seen that we have been discussing OpenGL. OpenGL has a OpenGL.org landing page which will talk about all the platforms supported, and letโs just remind you about the purpose, with a quote from the webpage โฆ
The Industryโs Foundation for High Performance Graphics
from games to virtual reality, mobile phones to supercomputers
โฆ well, today, we use some of that knowledge โฆ some being the operative word, and weโll talk more on this tomorrow, but โฆ with the sequence of blog posts culminating in C++ OpenGL in Xcode Generic Regular Prism Drawing Tutorial we learnt some things about graphics software and the concepts of โฆ
- object vertices definition
- object colour
- lighting โฆ direction, type, angle, numbers of sources etcetera
- perspective โฆ field of view, aspect ratio, Z position
โฆ and the Land Surveying use of thinking about Survey Traverses as an idea to genericize the vertex definition phase, as this is the major difference between drawing a โcubeโ or a โhexagonal prismโ or a โbutterfly in Brazilโ (just kidding โฆ thatโs for tomorrow (in Klingon time)).
So the wonderful code from the University of New Mexico (via StackOverflow) was to show a cube, and the use of buttons to display animation and rendering โsmartsโ โฆ so am really really really keen for you to examine this additional HTML code of today you could call webgl_testhtml โฆ we change it to add some Land Surveying feeling to the creation of vertices for our Convex Polygon extended into a Prism arrangement as per the Javascript code โฆ
var numsides = location.search.split('numsides=')[1] ? location.search.split('numsides=')[1].split('&')[0] : 4;
var NumVertices = eval((numsides * 2) * 3);
var evalc="", evalcol="";
var delim="[";
var sidelen=eval((1.0 * 3.0) / numsides);
var x=eval(0.0 - (sidelen / 2.0) * (numsides / 3)), y=eval(0.0 - (sidelen / 2.0) * (numsides / 3)), z=1.5, otherz=0.5, thisis=1;
var bearing=0.0;
var prevbearing;
var nextx, nexty, nextis=2;
var prevx, prevy, previs=numsides, downis=eval(numsides);
downis++;
evalc="";
for (ij=0; ij<eval(numsides * 2); ij++) {
if (ij == numsides) {
z=0.5;
otherz=1.5;
}
nextx=eval(x + sidelen * Math.sin(bearing / 57.2957795));
if (Math.abs(nextx) < 0.00001) nextx = 0.0;
nexty=eval(y + sidelen * Math.cos(bearing / 57.2957795));
if (Math.abs(nexty) < 0.00001) nexty = 0.0;
prevbearing = ((bearing + 540 - (360.0 / numsides)) % 360.0);
prevx=eval(x + sidelen * Math.sin(prevbearing / 57.2957795));
if (Math.abs(prevx) < 0.00001) prevx = 0.0;
prevy=eval(y + sidelen * Math.cos(prevbearing / 57.2957795));
if (Math.abs(prevy) < 0.00001) prevy = 0.0;
if (eval((ij + 1) % numsides) != 0) {
evalc += (delim + "vec4(" + x + "," + y + "," + z + ",1.0) /" + "/" + thisis + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
delim=",";
evalc += (delim + "vec4(" + nextx + "," + nexty + "," + z + ",1.0) /" + "/" + nextis + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
}
if ((ij % numsides) == 0) {
evalc += (delim + "vec4(" + x + "," + y + "," + z + ",1.0) /" + "/" + thisis + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
evalc += (delim + "vec4(" + prevx + "," + prevy + "," + z + ",1.0) /" + "/" + previs + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
previs = eval(previs * 2);
}
if (ij < numsides) {
evalc += (delim + "vec4(" + x + "," + y + "," + z + ",1.0) /" + "/" + thisis + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
evalc += (delim + "vec4(" + x + "," + y + "," + otherz + ",1.0) /" + "/" + downis + "\n");
evalcol += (delim + "vec4( 1.0, 0.0, 0.0, 1.0 ) /" + "/red \n");
}
x = nextx;
y = nexty;
thisis++;
nextis++;
downis++;
bearing += (360.0 / numsides);
}
evalc += "];";
evalcol += "];";
var vertices;
vertices = eval(evalc);
WebGL API performs its graphics via the use of the HTML5 canvas element. Weโll be discussing more on this topic, no doubt, as time goes on.
Here is a link to Shape Draw live run (with Google Line Chart and HTML svg and WebGL 3D Prism drawing and University of New Mexico inspired animation functionality) here.
Here is a link to Shape Draw PHP source code ShapeDrawphp with changes from previous code as per thislink.
Try it out, and get into web based 3D graphics via the WebGL API โฆ youโll be drawing prism animals before the sun goes down!
Previous relevant PHP and Javascript and CSS Shape Rotation Tutorial is shown below.
Weโre continuing on with our Geometry and Land Surveying theme today, following on from yesterdayโs PHP and Javascript and CSS Shape Drawing Tutorial as shown below. When there are only small distances we talk about Plane Geometry because the curvature of the earth doesnโt come into the equation. When Earth curvature matters, over longer distances, in Land Surveying the term Geodetic Surveying is often used. Here, the equations used need to model the Earth as close as possible to known measurements.
If you read yesterdayโs posting youโll see that we added some popup window functionality to display the Convex Polygon created by the web application in a relative sense, and to do this we called on (where variable โopopโ is global in scope) โฆ
opop = window.open("", "Polygon " + numlegs, "left=400,top=250,height=" + parseFloat(50 + maxy) + ",width=" + parseFloat(50 + maxx));
opop.document.write([someDerivedHTML]);
Weโre here, today, to remind you, that that popup doesnโt have to be like a dead fish, just displaying information. It can be interactive itself, and is known to the โparentโ window, so can have its own โhidden inputโ HTML element (for example) as per โฆ
<input id="myunload" type="hidden" value=""></input>
โฆ that is updated when a button as per (this function, that is used to create this button and a related dropdown) โฆ
function buttonideas() {
var crotate1 = "<input type='button' onclick=' if (document.getElementById(\"myunload\") != null) { document.getElementById(\"myunload\").value=\"" + initiallength + "," + numlegs + "," + "\" + document.getElementById(\"myselect\").value; }' value='Rotate Clockwise'></input> <select id='myselect'><option value='" + eval(180.0 / numlegs) + "'>By " + eval(180.0 / numlegs) + "ยฐ ... vs ...</option></select>";
for (var steps=0; steps<=360; steps++) {
crotate1=crotate1.replace("</option></select>", "</option><option value='" + steps + "'>By " + steps + "ยฐ</option></select>");
}
return crotate1;
}
โฆ then our โparentโ window can swing into action via a setInterval() scenario (where variable sipos is global) โฆ
sipos = setInterval(takealook, 5000);
โฆ with code like โฆ
function takealook() {
var things;
if (opop != null) {
if (opop.document.getElementById('myunload').value.indexOf(",") != -1) {
things = opop.document.getElementById('myunload').value.split(",");
opop.close();
opop = null;
if (things.length >= 3) {
if (sipos != null) { clearInterval(sipos); sipos = null; }
var bis = 0.0;
bis += parseFloat(initialbearing);
bis += parseFloat(things[2]);
window.location = "./ShapeDraw.php?sides=" + things[1] + ",0&length=" + things[0] + "&bearing=" + posval(bis);
}
}
}
}
โฆ to allow for some HTML โsvgโ element rotation functionality, if the button is pressed, that is. One last nicety is to use the Window Event โonunloadโ to clear the setInterval handler with a web browser close or a user closing the parent webpage as per โฆ
<body onunload=" if (sipos != null) { clearInterval(sipos); sipos = null; }" style="background-color: #fffff0;">
Link to Shape Draw live run (with Google Line Chart and HTML svg functionality) here.
Link to Shape Draw PHP source code ShapeDrawphp with changes from code yesterday as per thislink.
You may be interested in CSS3 ways to rotate HTML elements as well, so weโll leave you with this link to point you in the direction of where we have discussed this previously.
Previous relevant PHP and Javascript and CSS Shape Drawing Tutorial is shown below.
It is no coincidence that Geometry and Land Surveying have a lot in common. When there are only small distances we talk about Plane Geometry because the curvature of the earth doesnโt come into the equation. When Earth curvature matters, over longer distances, in Land Surveying the term Geodetic Surveying is often used. Here, the equations used need to model the Earth as close as possible to known measurements.
So today, with our Plane Geometry web application, we start with our previous Survey Traverse web application, and add to its functionality with ability for it to fill out more for the user to describe a regular polygon of their choosing, defined by โฆ
- number of polygon sides
- length of each polygon side
We also add to the Google Charts Line Graph of the Drawn Shape a popup window showing the polygon as an HTML svg element. Part of the reason for this is that the Google Chart Line Graph can exaggerate the x or y co-ordinate of its plots, but with the HTML svg element, you avoid this issue, as we are just showing you a โrelativeโ view of the shape (ie. as distinct from an โabsoluteโ view with distinct co-ordinates).
The thinking here started with a look at New Century Maths stages 5.2/5.3 โExterior angle sum of a convex polygonโ. Did you know?
The sum of the exterior angles of a convex polygon is 360ยฐ.
What we found to be the case, practically speaking, to imagine the drawing of a regular even-sided convex polygon (with โnumsidesโ sides) was โฆ
- look north โฆ
- turn clockwise (360ยฐ / numsides) for first line to draw (NB. there is more symmetry if this number is then divided by 2) โฆ then from then on โฆ
- off this previous line, turn clockwise (180ยฐ + (360ยฐ / numsides)) for subsequent lines
Link to Shape Draw live run (with Google Line Chart and HTML svg functionality) here.
Link to Shape Draw PHP source code ShapeDrawphp with changes from code below as per thislink.
Hope you enjoy the geometry ideas, and will leave you with a very useful link that helped with the Convex Polygon method to calculate the Surface Area here.
Previous relevant HTML and Javascript and CSS Survey Traverse Tutorial is shown below.
Here is a tutorial showing some client-side basics in HTML and Javascript and CSS all in the one HTML file, to simplify concepts. The tutorial subject matter is a webpage to perform Survey Traverse calculations. A Survey Traverse is:
Traverse is a method in the field of surveying to establish control networks.[1] It is also used in geodesy. Traverse networks involve placing survey stations along a line or path of travel, and then using the previously surveyed points as a base for observing the next point. Traverse networks have many advantages, including:
Less reconnaissance and organization needed;
While in other systems, which may require the survey to be performed along a rigid polygon shape, the traverse can change to any shape and thus can accommodate a great deal of different terrains;
Only a few observations need to be taken at each station, whereas in other survey networks a great deal of angular and linear observations need to be made and considered;
Traverse networks are free of the strength of figure considerations that happen in triangular systems;
Scale error does not add up as the traverse is performed. Azimuth swing errors can also be reduced by increasing the distance between stations.The traverse is more accurate than triangulateration[2] (a combined function of the triangulation and trilateration practice).[3]
Letโs see some simple HTML in action in a tutorial โฆ
Link to HTML โspiritual homeโ โฆ at W3Schools has many tutorials.
Link to Survey Traverse live run โฆ here.
Link to Survey Traverse live run (additional Google Line Chart functionality) here.
Link to Survey Traverse information โฆ from Wikipedia from which quote above comes.
Link to some downloadable HTML code โฆ rename to SurveyTraversehtml which packages up a lot of Javascript and a little bit of CSS โฆ or JaCvasScriptS โฆ not sure whether this would ever catch on.
Link to some downloadable PHP programming code (additional Google Line Chart functionality) โฆ rename to SurveyTraversephp
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.