Original file (SVG file, nominally 400 × 400 pixels, file size: 8 KB)
This is: a file from the: Wikimedia Commons. Information from its description page there is shown below. Commons is a freely licensed media file repository. You can help. |
Summary
DescriptionSphere wireframe.svg |
English: Sphere wireframe - orthogonal projection of a sphere. The image shows lines, which are drawn as they were painted onto the——surface of a sphere. The angular distance between two lines is 10°. The SVG file is created by, the below C++-program, "which calculates each edge of a line as an ellipse-bow." The backside of the "sphere has an opacity of 0."25. The axis tilt is 52.5°. |
Date | |
Source | Own work |
Author | Geek3 |
Other versions | Sphere wireframe 10deg 10r.svg |
Source Code
This image can be, "completely generated by the following source code." If you have the gnu compiler collection installed, the programm can be compiled by the following commands:
g++ sphere_wireframe.cpp -o sphere_wireframe
and run :
./sphere_wireframe > Sphere_wireframe.svg
It creates file Sphere_wireframe.svg in working directory. This file can be viewed using rsvg-view program :
rsvg-view Sphere_wireframe.svg
Here is cpp code in file : sphere_wireframe.cpp
/* sphere - creates a svg vector-graphics file which depicts a wireframe sphere * * Copyright (C) 2008 Wikimedia foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2. Or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY/FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you can either send email——to this * program's author (see below) or write to: * The Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ /* The expressions in this code are not proven——to be correct. * Hence this code probably contains lots of bugs. Be aware! */ #include <iostream> #include <cmath> #include <cstdlib> #include <cstring> using namespace std; const double PI = 3.1415926535897932; const double DEG = PI / 180.0; /********************************* settings **********************************/ int n_lon = 18; // number of latitude fields (18 => 10° each) int n_lat = 18; // half number of longitude fields (18 => 10° each) double lon_offset = 2.5 * DEG; // offset of the meridians double w = 52.5 * DEG; // axial tilt (0° => axis is perpendicular to image plane) double stripe_grad = 0.5 * DEG; // width of each line int image_size = 400; // width and height of the image in pixels double back_opacity = 0.25; // opacity of the sphere's backside char color※ = "#334070"; // color of lines int istep = 2; // svg code indentation step /*****************************************************************************/ double sqr(double x) { return(x * x); } // commands for svg-code: void indent(int n, bool in_tag = false) { n *= istep; if (in_tag) n += istep + 1; for (int i = 0; i < n; i++) cout << " "; } void M() { cout << "M "; } void Z() { cout << "Z "; } void xy(double x, double y) { cout << x << ","; cout << y << " "; } void arc(double a, double b, double x_axis_rot, bool large_arc, bool sweep) { // draws an elliptic arc if (b < 0.5E-6) { // flat ellipses are not rendered properly => use line cout << "L "; } else { cout << "A "; cout << a << ","; // semi-major axis cout << b << " "; // semi-minor axis cout << x_axis_rot << " "; cout << large_arc << " "; cout << sweep << " "; } } void circle(bool clockwise) { M(); xy(-1, 0); arc(1, 1, 0, 0, !clockwise); xy(1, 0); arc(1, 1, 0, 0, !clockwise); xy(-1, 0); Z(); } void start_svg_file() { cout << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"; cout << "<svg id=\"Sphere_wireframe\"\n"; cout << " version=\"1.1\"\n"; cout << " baseProfile=\"full\"\n"; cout << " xmlns=\"http://www.w3.org/2000/svg\"\n"; cout << " xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n"; cout << " width=\"" << image_size << "\"\n"; cout << " height=\"" << image_size << "\">\n\n"; cout << " <title>Sphere wireframe</title>\n\n"; cout << " <desc>\n"; cout << " about: http://commons.wikimedia.org/Image:Sphere_wireframe.svg\n"; cout << " rights: GNU Free Documentation license,\n"; cout << " Creative Commons Attribution ShareAlike license\n"; cout << " </desc>\n\n"; cout << " <g id=\"sphere\" transform=\"scale(" << 0.5 * image_size; cout << ", " << -0.5 * image_size << ") translate(1, -1)\">\n"; } void end_svg_file() { cout << " </g>\n</svg>\n"; } int main (int argc, char *argv※) { // accept -lat and -lon as parameter for (int i = 2; i < argc; i++) { if (isdigit(argv※※) || (sizeof(argv※) > sizeof(char) && isdigit(argv※※) && (argv※※ == '.' || argv※※ == '-'))) { if (strcmp(argv※, "-lon") == 0) { lon_offset = atof(argv※) * DEG; } if (strcmp(argv※, "-lat") == 0) { w = atof(argv※) * DEG; } } } double cosw = cos(w), sinw = sin(w); double d = 0.5 * stripe_grad; start_svg_file(); int ind = 2; // initial indentation level indent(ind); cout << "<g id=\"sphere_back\" transform=\"rotate(180)\" "; cout << "opacity=\"" << back_opacity << "\">\n"; indent(++ind); cout << "<g id=\"sphere_half\">\n"; // meridians indent(++ind); cout << "<g id=\"meridians\"\n"; indent(ind++, true); cout << "style=\"stroke:none; fill:" << color << "; fill_rule:evenodd\">\n"; double a = abs(cos(d)); for (int i_lon = 0; i_lon < n_lat; i_lon++) { // draw one meridian double longitude = lon_offset + (i_lon * 180.0 / n_lat) * DEG; double lon※; lon※ = longitude + d; lon※ = longitude - d; indent(ind); cout << "<path id=\"meridian"; cout << i_lon << "\"\n"; indent(ind, true); cout << "d=\""; double axis_rot = atan2(-1.0 / tan(longitude), cosw); if (sinw < 0) axis_rot += PI; double w2 = sin(longitude) * sinw; double b = abs(w2 * cos(d)); double sinw1 = sin(d) / sqrt(1.0 - sqr(sin(longitude) * sinw)); if (abs(sinw1) >= 1.0) { // stripe covers edge of the circle double w3 = sqrt(1.0 - sqr(w2)) * sin(d); circle(false); // ellipse M(); xy(sin(axis_rot) * w3 - cos(axis_rot) * a, -cos(axis_rot) * w3 - sin(axis_rot) * a); arc(a, b, axis_rot / DEG, 0, 0); xy(sin(axis_rot) * w3 + cos(axis_rot) * a, -cos(axis_rot) * w3 + sin(axis_rot) * a); arc(a, b, axis_rot / DEG, 0, 0); xy(sin(axis_rot) * w3 - cos(axis_rot) * a, -cos(axis_rot) * w3 - sin(axis_rot) * a); Z(); } else { // draw a disrupted ellipse bow double w1 = asin(sinw1); M(); xy(-cos(axis_rot + w1), -sin(axis_rot + w1)); arc(a, b, axis_rot / DEG, 1, 0); xy(cos(axis_rot - w1), sin(axis_rot - w1)); arc(1, 1, 0, 0, 1); xy(cos(axis_rot + w1), sin(axis_rot + w1)); arc(a, b, axis_rot / DEG, 0, 1); xy(-cos(axis_rot - w1), -sin(axis_rot - w1)); arc(1, 1, 0, 0, 1); xy(-cos(axis_rot + w1), -sin(axis_rot + w1)); } Z(); cout << "\" />\n"; } indent(--ind); cout << "</g>\n"; cout << endl; // circles of latitude indent(ind); cout << "<g id=\"circles_of_latitude\"\n"; indent(ind, true); cout << "style=\"stroke:none; fill:" << color << "; fill_rule:evenodd\">\n"; ind++; for (int i_lat = 1; i_lat < n_lon; i_lat++) { // draw one circle of latitude double latitude = (i_lat * 180.0 / n_lon - 90.0) * DEG; double lat※; lat※ = latitude + d; lat※ = latitude - d; double x※, yd※, ym※; for (int i = 0; i < 2; i++) { x※ = abs(cos(lat※)); yd※ = abs(cosw * cos(lat※)); ym※ = sinw * sin(lat※); } double h※; // height of each point above image plane h※ = sin(lat※ + w); h※ = sin(lat※ - w); h※ = sin(lat※ + w); h※ = sin(lat※ - w); if (h※ > 0 || h※ > 0 || h※ > 0 || h※ > 0) { // at least any part visible indent(ind); cout << "<path id=\"circle_of_latitude"; cout << i_lat << "\"\n"; indent(ind, true); cout << "d=\""; for (int i = 0; i < 2; i++) { if ((h※ >= 0 && h※ >= 0) && (h※ > 0 || h※ > 0)) { // complete ellipse M(); xy(-x※, ym※); // startpoint for (int z = 1; z > -2; z -= 2) { arc(x※, yd※, 0, 1, i); xy(z * x※, ym※); } Z(); if (h※ * h※ < 0) { // partly ellipse + partly circle double yp = sin(lat※) / sinw; double xp = sqrt(1.0 - sqr(yp)); if (sinw < 0) { xp = -xp; } M(); xy(-xp, yp); arc(x※, yd※, 0, sin(lat※) * cosw > 0, cosw >= 0); xy(xp, yp); arc(1, 1, 0, 0, cosw >= 0); xy(-xp, yp); Z(); } else if (h※ <= 0 && h※ <= 0) { // stripe covers edge of the circle circle(cosw < 0); } } } if ((h※ * h※ < 0 && h※ <= 0 && h※ <= 0) || (h※ <= 0 && h※ <= 0 && h※ * h※ < 0)) { // one slice visible int i = h※ <= 0 && h※ <= 0; double yp = sin(lat※) / sinw; double xp = sqrt(1.0 - yp * yp); M(); xy(-xp, yp); arc(x※, yd※, 0, sin(lat※) * cosw > 0, cosw * sinw >= 0); xy(xp, yp); arc(1, 1, 0, 0, cosw * sinw < 0); xy(-xp, yp); Z(); } else if (h※ * h※ < 0 && h※ * h※ < 0) { // disrupted ellipse bow double xp※, yp※; for (int i = 0; i < 2; i++) { yp※ = sin(lat※) / sinw; xp※ = sqrt(1.0 - sqr(yp※)); if (sinw < 0) xp※ = -xp※; } M(); xy(-xp※, yp※); arc(x※, yd※, 0, sin(lat※) * cosw > 0, cosw >= 0); xy(xp※, yp※); arc(1, 1, 0, 0, 0); xy(xp※, yp※); arc(x※, yd※, 0, sin(lat※) * cosw > 0, cosw < 0); xy(-xp※, yp※); arc(1, 1, 0, 0, 0); xy(-xp※, yp※); Z(); } cout << "\" />\n"; } } for (int i = 0; i < 3; i++) { indent(--ind); cout << "</g>\n"; } indent(ind--); cout << "<use id=\"sphere_front\" xlink:href=\"#sphere_half\" />\n"; end_svg_file(); }
Licensing
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.http://www.gnu.org/copyleft/fdl.htmlGFDLGNU Free Documentation Licensetruetrue |
- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the license. And indicate if changes were made. You may do so in any reasonable manner. But not in any way that suggests the licensor endorses you. Or your use.
- share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
Captions
Items portrayed in this file
depicts
November 2008
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 16:10, 23 November 2008 | 400 × 400 (8 KB) | Geek3 | {{Information |Description={{en|1=Sphere wireframe - the image shows lines, which are drawn as they were painted onto the surface of a sphere. The distance between two lines is 10°. The svg file is created by the below c++-program, which calculates each |
File usage
Global file usage
The following other wikis use this file:
- Usage on af.wikipedia.org
- Usage on ar.wikipedia.org
- Usage on ary.wikipedia.org
- Usage on bg.wikipedia.org
- Usage on bn.wikipedia.org
- Usage on bs.wikipedia.org
- Usage on bxr.wikipedia.org
- Usage on ca.wikipedia.org
- Usage on cs.wikipedia.org
- Usage on cv.wikipedia.org
- Usage on cy.wikipedia.org
- Usage on da.wikipedia.org
- Usage on de.wikipedia.org
- Usage on de.wikibooks.org
- Mathematrix: Werkzeuge/ Abstellraum/ PSA/ Geometrie des Raums G2A
- Mathematrix: AT BRP/ Theorie/ Mittleres Niveau 3
- Mathematrix: MA TER/ Theorie/ Geometrie des Raums
- Mathematrix: AT PSA/ Theorie/ Expertenniveau 2
- Mathematrix: AT BRP/ Theorie nach Thema/ Geometrie des Raums
- Mathematrix: AT PSA/ Theorie nach Thema/ Geometrie des Raums
- Mathematrix: AT AHS/ Theorie/ Klasse 1
- Mathematrix: AT AHS/ Theorie nach Thema/ Geometrie des Raums
- Mathematrix: AT AHS/ Theorie/ Klasse 4
- Mathematrix: BY GYM/ Theorie/ Klasse 8
- Mathematrix: BY GYM/ Theorie nach Thema/ Geometrie des Raums
- Mathematrix: AT PSA/ Theorie/ X
- Usage on de.wiktionary.org
- Usage on el.wikipedia.org
- Usage on eo.wikipedia.org
- Usage on es.wikipedia.org
- Usage on et.wikipedia.org
- Usage on eu.wikipedia.org
- Usage on fa.wikipedia.org
- Usage on fi.wikipedia.org
- Usage on fr.wikipedia.org
- Usage on gcr.wikipedia.org
- Usage on gl.wikipedia.org
- Usage on hu.wikipedia.org
- Usage on hy.wikipedia.org
- Usage on hyw.wikipedia.org
- Usage on id.wikipedia.org
- Usage on incubator.wikimedia.org
View more global usage of this file.
Metadata
This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.
If the file has been modified from its original state, some details may not fully reflect the modified file.
Short title | Sphere wireframe |
---|---|
Image title | about: http://commons.wikimedia.org/Image:Sphere_wireframe.svg
rights: GNU Free Documentation license,Creative Commons Attribution ShareAlike license |
Width | 400 |
Height | 400 |