Das Programmierer-Spiel

    Heyho,

    das Programmierspiel ist echt ne coole Idee :D.

    Ich bin mal so frech und poste meinen Code zum Verstecken von Zeichenketten in einem Bild. Programmiersprache ist egal; daher hab ichs mal in Javascript umgesetzt (bisher nur mit dem neusten Firefox und .png-Dateien getestet):
    Spoiler anzeigen

    PHP-Quellcode

    1. <html>
    2. <body>
    3. <input id="data" type="text" value="codebot.de">
    4. <input type="file" id="files" name="files[]" multiple />
    5. <button id="write">Schreiben!</button>
    6. <button id="read">Auslesen</button>
    7. <output id="list"></output>
    8. <script>
    9. //Quellen für Code: http://www.html5rocks.com/en/tutorials/file/filesystem/ , http://www.html5rocks.com/en/tutorials/canvas/imagefilters/ , http://stackoverflow.com/questions/4773966/drawing-an-image-from-a-data-url-to-a-canvas , https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas
    10. var write = function(){
    11. var pixel = Filters.getPixels(document.getElementById('bild'));
    12. var newPixel = Filters.storeData(pixel, document.getElementById('data').value);
    13. var canvas = document.getElementById('bild');
    14. var ctx = canvas.getContext('2d');
    15. ctx.putImageData(newPixel, 0, 0);
    16. };
    17. var read = function(){
    18. var pixel = Filters.getPixels(document.getElementById('bild'));
    19. alert(Filters.readData(pixel));
    20. };
    21. document.getElementById("write").onclick=write;
    22. document.getElementById("read").onclick=read;
    23. function handleFileSelect(evt) {
    24. var files = evt.target.files; // FileList object
    25. // Loop through the FileList and render image files as thumbnails.
    26. for (var i = 0, f; f = files[i]; i++) {
    27. // Only process image files.
    28. if (!f.type.match('image.*')) {
    29. continue;
    30. }
    31. var loader = new FileReader();
    32. // Closure to capture the file information.
    33. loader.onload = (function(theFile) {
    34. return function(e) {
    35. // Render thumbnail.
    36. var span = document.createElement('span');
    37. /*
    38. span.innerHTML = ['<img id="bild" class="thumb" src="', e.target.result,
    39. '" title="', escape(theFile.name), '"/>'].join('');
    40. */
    41. span.innerHTML = '<canvas id="bild">Dein Browser ist Mist!</canvas>'
    42. document.getElementById('list').innerHTML = '';
    43. document.getElementById('list').insertBefore(span, null);
    44. var canvas = document.getElementById('bild');
    45. var ctx = canvas.getContext('2d');
    46. var img = new Image;
    47. img.onload = function(){
    48. canvas.width = this.width;
    49. canvas.height = this.height;
    50. ctx.drawImage(img,0,0); // Or at whatever offset you like
    51. };
    52. img.src = e.target.result;
    53. };
    54. })(f);
    55. // Read in the image file as a data URL.
    56. loader.readAsDataURL(f);
    57. }
    58. }
    59. document.getElementById('files').addEventListener('change', handleFileSelect, false);
    60. Filters = {};
    61. Filters.getCanvas = function(w,h) {
    62. var c = document.createElement('canvas');
    63. c.width = w;
    64. c.height = h;
    65. return c;
    66. };
    67. Filters.getPixels = function(img) {
    68. /*
    69. var c = this.getCanvas(img.width, img.height);
    70. var ctx = c.getContext('2d');
    71. ctx.drawImage(img, img.width, img.height);
    72. document.getElementById('list').innerHTML = '';
    73. document.getElementById('list').insertBefore(c, null);
    74. */
    75. var c = document.getElementById('bild');
    76. var ctx = c.getContext('2d');
    77. return ctx.getImageData(0,0,c.width,c.height);
    78. };
    79. Filters.storeData = function(pixels, stringData) {
    80. var d = pixels.data;
    81. var pixelNum = 0;
    82. if(stringData.length>255)throw "String darf nicht länger als 255 Zeichen sein.";
    83. //Die Länge des Strings als erstes Zeichen anfügen:
    84. stringData = String.fromCharCode(stringData.length) + stringData;
    85. //anschließend alles in die Pixel des Bilds eintragen:
    86. for(var ci = 0; ci<stringData.length && pixelNum<d.length; ci++){
    87. var charCode = stringData.charCodeAt(ci);
    88. //Die 8-Bit des ASCII-Codes schreiben: (funktioniert nur mit ASCII-codierten Strings)
    89. for(var exp = 0; exp<8; exp++){
    90. var mask = 1 << exp,
    91. num = (mask & charCode)>>exp;
    92. //d[pixelNum+0] entspricht R-Wert...
    93. //d[pixelNum+1] entspricht G-Wert...
    94. //d[pixelNum+2] entspricht B-Wert!
    95. //LSB-Setzen:
    96. d[pixelNum+2] = (d[pixelNum+2] & ~1 ) | num; //Momentan wird nur das letzte Bit im B-Wert gesetzt.
    97. pixelNum += 4; //Nach dem schreiben eines Bit, zum nächsten Pixel wechseln
    98. }
    99. }
    100. //for (var i=0; i<d.length; i+=4) {
    101. //d[i] += adjustment;
    102. //d[i+1] += adjustment;
    103. //d[i+2] += adjustment;
    104. //}
    105. return pixels;
    106. };
    107. Filters.readByte = function(fromPixels, fromPixelNum){
    108. var ret = 0;
    109. for(var exp = 0; exp<8;exp++){
    110. var num = fromPixels[fromPixelNum+2] & 1; //LSB-Lesen
    111. ret += (num<<exp)
    112. fromPixelNum += 4; //Nach dem Lesen eines Bit, zum nächsten Pixel wechseln
    113. }
    114. return ret;
    115. }
    116. Filters.readData = function(pixels) {
    117. var d = pixels.data,
    118. ret = "",
    119. dataLength = this.readByte(d,0);
    120. for (var i=0; i<dataLength; i++) {
    121. var charCode = this.readByte(d, 32+i*32);
    122. ret += String.fromCharCode(charCode);
    123. }
    124. return ret;
    125. };
    126. </script>
    127. </body>
    128. </html>


    Der ganze Code ist aus dem Internet zusammengeklaut. Habe im Code auch die Quellen angegeben. Ihr könnt den Code auch direkt hier ausprobieren: codepen.io/JanUlrich/full/lIavK (bzw. hier das codepen-Projekt zum Spielen: codepen.io/JanUlrich/pen/lIavK )

    MFG
    JanUlrich :love:

    PS: Ich denke mir noch ein neues Projekt aus. Gerade weiß ich leider keines. Falls Ferdi seine API noch fertig kriegt, kann er von mir aus auch eine Projektaufgabe stellen...

    "Eine Nation, die sich von Brot und Nudeln ernährt, ist unbezwingbar." Zitat Josef Stalin, Sowjetischer Politiker und Kohlenhydrate-Fan.
    Ich habe jetzt eine Idee für ein Programm. Das ist ein privates Anliegen von mir. Ich hoffe das geht in Ordnung.
    Momentan führe ich bei meinem Bekanntenkreis Pidgin ein.
    Problem: Pidgin fügt sich bei der Installation nicht dem Autostart hinzu, was bei einem Messenger wie Pidgin jedoch durchaus Sinn macht. Zudem ist das Plugin für "Off the record-Messaging" nicht automatisch installiert.
    Kann also jemand ein Installationsprogramm schreiben, welches Pidgin als auch das Plugin installiert und Pidgin zum Autostart hinzufügt? Im Idealfall sollte es noch "Off-the-Record-Messaging" im Einstellungsmenu unter Plugins aktivieren.

    Pidgin-Download: sourceforge.net/projects/pidgi…idgin-2.10.7.exe/download
    OTR-Plugin: chip.de/downloads/OTR-fuer-Pidgin_24518582.html

    Vielen Dank,
    JanUlrich

    "Eine Nation, die sich von Brot und Nudeln ernährt, ist unbezwingbar." Zitat Josef Stalin, Sowjetischer Politiker und Kohlenhydrate-Fan.
    Ich finde es zwar cool, das du die alte Aufgabe gelöst hast, aber findest du die neue Aufgabe nicht zu spezifisch? Ich meine, es fährst auf ebend genau diese Art Beispiel ab. Solange der Aufgabensteller damit kein Problem hat, kann er es ja gerne so lösen. Ansonsten würde ich vll vorschlagen das es flexibler gestaltet wird. Oder sogar abgespeckt. Okee ich weiß jz nicht wie aufwendig sowas ist, weil es sollten ja auch schon mini Projekte sein :D

    Aber ansonsten good luck, have fun beim Lösen der Aufgabe :)
    MfG Nico

    MfG - Mit freundlichen Grüssen

    die Welt liegt uns zu Füssen, den wir steh'n drauf

    wir geh'n drauf für ein Leben voller Schall und Rauch

    bevor wir fall'n, fall'n wir lieber auf.
    Ich kanns nicht haben, das dieser Thread hier ausstirbt. Daher eröffne ich wieder das Schlachtfeld. Die Aufgabe ist gar nicht mal so leicht, aber ich weiß das man vieles davon ergooglen kann, aber man kaum alles geordnet hat. Deswegen mache ich daraus mal eine Aufgabe! :)

    Die Aufgabe ist es kollisionsrechnungen zu sämtlichen geometrischen Formen zu haben. Als beispiel :

    Rechteck - Rechteck
    Rechteck - Kreis
    Kreis - Kreis
    Kreis - Dreieck
    Dreieck - Rechteck
    Dreieck - Dreieck
    .
    .
    .

    Also im grunde so eine Formel, das sie endweder TRUE für ja die beiden Formen berühren sich und false für nein, die berühren sich nicht ;)
    MfG Nico

    MfG - Mit freundlichen Grüssen

    die Welt liegt uns zu Füssen, den wir steh'n drauf

    wir geh'n drauf für ein Leben voller Schall und Rauch

    bevor wir fall'n, fall'n wir lieber auf.
    Hallo Niccoo,

    Hier ist meine Umsetzung in C++ ohne GUI und hardcoded Eingabe. Die Algorithmen habe ich überwiegend von hier geholt: geomalgorithms.com/


    Spoiler anzeigen

    C-Quellcode

    1. /**
    2. * (c) Pearl at codebot.de
    3. * Reference http://geomalgorithms.com/
    4. **/
    5. #include <iostream>
    6. #include <vector>
    7. using namespace std;
    8. #define SMALL_NUM 0.00000001 // anything that avoids division overflow
    9. struct Point {
    10. Point() {}
    11. Point(double x, double y) : x(x),y(y) {}
    12. double x;
    13. double y;
    14. double dot(const Point &pt) const {
    15. return (x * pt.x + y * pt.y);
    16. }
    17. double cross(const Point &pt) const {
    18. return (x * pt.y - y * pt.x);
    19. }
    20. double norm() const {
    21. return sqrt(this->dot((*this)));
    22. }
    23. double distance(const Point &pt) const {
    24. return ((*this)-pt).norm();
    25. }
    26. const Point operator+(const Point &pt) const {
    27. return Point(x + pt.x, y + pt.y);
    28. }
    29. const Point operator-(const Point &pt) const {
    30. return Point(x - pt.x, y - pt.y);
    31. }
    32. const Point operator*(const double scalar) const {
    33. return Point(x*scalar, y*scalar);
    34. }
    35. friend std::ostream &operator<<(std::ostream &os, const Point &pt) {
    36. return os << "[" << pt.x << "," << pt.y << "]";
    37. }
    38. };
    39. struct Line {
    40. Line() {}
    41. Line(Point a, Point b) : a(a),b(b) {}
    42. Point a;
    43. Point b;
    44. };
    45. struct Circle {
    46. Circle() {}
    47. Circle(double radius, Point center) : radius(radius),center(center) {}
    48. double radius;
    49. Point center;
    50. };
    51. double PointLineDistance(const Point &pt, const Line& line) {
    52. Point v = line.b-line.a;
    53. Point w = pt-line.a;
    54. double c1 = v.dot(w);
    55. if (c1 <= 0) // only segment
    56. return pt.distance(line.a);
    57. double c2 = v.dot(w);
    58. if (c2 <= c1) // only segment
    59. return pt.distance(line.b);
    60. double t = c1/c2;
    61. Point pb = line.a + v*t;
    62. return pt.distance(pb);
    63. }
    64. bool LineLineIntersection(Line line1, Line line2) {
    65. Point u = line1.b-line1.a;
    66. Point v = line2.b-line2.a;
    67. Point w = line1.a-line2.a;
    68. double D = u.cross(v);
    69. if (fabs(D) < SMALL_NUM) { // lines are parallel
    70. if (u.cross(w) != 0 || v.cross(w)) { // not collinear
    71. return false;
    72. }
    73. return true;
    74. }
    75. // check for intersection in line segment
    76. double sI = v.cross(w) / D;
    77. if (sI < 0 || sI > 1) {
    78. return false;
    79. }
    80. double tI = u.cross(w) / D;
    81. if (tI < 0 || tI > 1) {
    82. return false;
    83. }
    84. return true;
    85. }
    86. // does not check if point is on the edges
    87. bool PointInPolygon(const Point &pt, const vector<Line> &lines) {
    88. bool in = false;
    89. for (unsigned int i = 0; i < lines.size(); i++) {
    90. const Line &line = lines[i];
    91. if (line.a.y <= pt.y != line.b.y < pt.y // upward crossing
    92. && line.a.y > pt.y != line.b.y >= pt.y) { // downward crossing
    93. // compute edge-ray intersect for x-coordinate
    94. double vt = (pt.y - line.a.y) / (line.b.y - line.a.y + line.a.x);
    95. if (pt.x < line.a.x + vt* (line.b.x - line.a.x)) { // pt.x < intersect
    96. in = !in;
    97. }
    98. }
    99. }
    100. return in;
    101. }
    102. bool PolygonPolygonCollision(const vector<Line> &lines1, const vector<Line> &lines2) {
    103. // first check if any line intersect with an other line
    104. for (unsigned int i = 0; i < lines1.size(); i++) {
    105. for (unsigned int j = 0; j < lines2.size(); j++) {
    106. if (LineLineIntersection(lines1[i], lines2[j])) {
    107. return true;
    108. }
    109. }
    110. }
    111. // check if polygon is inside the other one
    112. if (PointInPolygon(lines1[0].a, lines2) || PointInPolygon(lines2[0].a, lines1)) {
    113. return true;
    114. }
    115. return false;
    116. }
    117. bool CirclePolygonCollision(const Circle &circle, const vector<Line> &lines) {
    118. // check if circle is inside polygon
    119. if (PointInPolygon(circle.center, lines)) {
    120. return true;
    121. }
    122. // check if distance between center and each line of the polygon is <= the radius
    123. for (unsigned int i = 0; i < lines.size(); i++) {
    124. if (PointLineDistance(circle.center, lines[i]) <= circle.radius) {
    125. return true;
    126. }
    127. }
    128. return false;
    129. }
    130. bool CircleCircleCollision(const Circle &circle1, const Circle &circle2) {
    131. // center distance
    132. double distance = circle1.center.distance(circle2.center);
    133. // collision distance
    134. double collision_distance = circle1.radius + circle2.radius;
    135. return distance < collision_distance;
    136. }
    137. int main(int argc, char *args[]) {
    138. // triangle
    139. Line a(Point(0,0), Point(0,3));
    140. Line b(Point(0,3), Point(2,0));
    141. Line c(Point(2,0), Point(0,0));
    142. vector<Line> triangle;
    143. triangle.push_back(a);
    144. triangle.push_back(b);
    145. triangle.push_back(c);
    146. // rectangle1
    147. Line d(Point(1,1), Point(1,5));
    148. Line e(Point(1,5), Point(5,5));
    149. Line f(Point(5,5), Point(5,1));
    150. Line g(Point(5,1), Point(1,1));
    151. vector<Line> rectangle1;
    152. rectangle1.push_back(d);
    153. rectangle1.push_back(e);
    154. rectangle1.push_back(f);
    155. rectangle1.push_back(g);
    156. // rectangle2
    157. Line h(Point(2,2), Point(2,4));
    158. Line i(Point(2,4), Point(4,4));
    159. Line j(Point(4,4), Point(4,2));
    160. Line k(Point(4,2), Point(2,2));
    161. vector<Line> rectangle2;
    162. rectangle2.push_back(h);
    163. rectangle2.push_back(i);
    164. rectangle2.push_back(j);
    165. rectangle2.push_back(k);
    166. // circle1
    167. Circle circle1 (2, Point(0,0));
    168. Circle circle2 (5.2, Point(5,5));
    169. // triangle and rectangle1 collide
    170. cout << PolygonPolygonCollision(triangle, rectangle1) << endl;
    171. // triangle and rectangle2 does not collide
    172. cout << PolygonPolygonCollision(triangle, rectangle2) << endl;
    173. // rectangle1 and rectangle2 collide (rectangle 2 in rectangle1)
    174. cout << PolygonPolygonCollision(rectangle1, rectangle2) << endl;
    175. // rectangle2 and circle1 does not collide
    176. cout << CirclePolygonCollision(circle1, rectangle2) << endl;
    177. // circle1 and circle2 collide
    178. cout << CircleCircleCollision(circle1, circle2) << endl;
    179. // circle and triangle do not collide
    180. cout << CirclePolygonCollision(circle2, triangle) << endl;
    181. cin.sync();
    182. cin.get();
    183. return 0;
    184. }
    Ein Tool, was in einem AutoIt script alle Funktionsnamen so umbennent, das man nicht mehr erkennt was sie sein sollten und jede varriable umbenennt un was anderes, am besten was verwirrendes.
    also das man den code nicht emhr so leicht erkennen kann und er aber noch Funktioniert
    als extra villeicht alle kommentare entfernen ;)