開発環境
- OS X Mavericks - Apple (OS)
- Dart Editor (開発環境)
- Dartium | Dart/ Structured web apps (ブラウザ, Dart VM 用 (Chromium with the Dart VM))
- Safari (ブラウザ, JavaScript 用)
- Dart (プログラミング言語)
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の12章(各種ツール)、12.7(練習問題)、12-4、5.をDartで解いてみる。
その他参考書籍
- What is Dart? [Kindle版] (O'Reilly Media) Kathy Walrath Seth Ladd (著) このブログでの感想
12.7(練習問題)、12-4、5.
コード
sample.dart
import 'dart:html'; void main() { InputElement run = querySelector('#run_dart'); InputElement clear = querySelector('#clear'); Element pre = querySelector('#pre0'); run.onClick.listen((MouseEvent event){ pre.text = '${window.navigator.userAgent}\n'; for(List<List<List<num>>> lines in [[[[0, 0], [1, 1]], [[1, 0], [2, 1]]], [[[0, 0], [1, 1]], [[0, 1], [1, 0]]], [[[0, 0], [1, 1]], [[1, 1], [2, 2]]], [[[0, 0], [1, 1]], [[0, 0], [1, 1]]], [[[0, 0], [2, 2]], [[1, 1], [3, 3]]]]){ var result; try{ result = lineIntersect(lines.first, lines.last); }catch(e){ result = e; } finally { pre.text += '$result\n'; } } }); clear.onClick.listen((MouseEvent event) => pre.text = ''); } lineIntersect(List<List<num>> line1, List<List<num>> line2){ var new_line1 = newLine(line1); var new_line2 = newLine(line2); var slope1 = slope(new_line1); var slope2 = slope(new_line2); var y_intercept1 = yIntercept(new_line1); var y_intercept2 = yIntercept(new_line2); var infinity = 1 / 0; var y1 = slope1 * new_line2[0][0] - y_intercept1; var y2 = slope2 * new_line1[0][0] - y_intercept2; var x = -(y_intercept1 - y_intercept2) / (slope1 - slope2); var y = slope1 * x + y_intercept1; if (isEqualLine(new_line1, new_line2)){ throw "Geometry"; } if (slope1 == slope2){ if(y_intercept1 == y_intercept2){ if(new_line1[0][0] > new_line2[1][0] || new_line1[1][0] < new_line2[0][1]){ return null; } if (new_line1[0][0] == new_line2[1][0] && new_line1[0][1] == new_line2[1][1]){ return new_line1[0]; } if(new_line1[1][0] == new_line2[0][0] && new_line1[1][1] == new_line2[0][1]){ return new_line1.last; } return line1; } return null; } if(slope1 == infinity){ if(new_line1[0][0] < new_line2[0][0] || new_line1[0][0] > new_line2[1][0] || y2 < new_line1[0][1] || y2 > new_line1[1][1]){ return null; } return [new_line1[0][0], y2]; } if(slope2 == infinity){ if(new_line2[0][0] < new_line1[0][0] || new_line2[0][0] > new_line1[1][0] || y1 < new_line2[0][1] || y1 > new_line2[1][1]){ return null; } return [new_line1[0][0], y1]; } if (new_line1[0][0] <= x && x <= new_line1[1][0] && new_line2[0][0] <= x && x <= new_line2[1][0] && min(new_line1[0][1], new_line1[1][1]) <= y && y <= max(new_line1[0][1], new_line1[1][1]) && min(new_line2[0][1], new_line2[1][1]) <= y && y <= max(new_line2[0][1], new_line2[1][1])){ return [x, y]; } return null; } List<List<num>> newLine(List<List<num>> line){ List<List<num>> new_line = line; var x1 = line[0][0]; var x2 = line[1][0]; var y1 = line[0][1]; var y2 = line[1][1]; if(x1 > x2 || (x1 == x2 && y1 > y2)){ new_line = [[x2, y2], [x1, y1]]; } return new_line; } num slope(List<List<num>> line){ var x1 = line[0][0]; var x2 = line[1][0]; var y1 = line[0][1]; var y2 = line[1][1]; return (y2 - y1) / (x2 - x1); } num yIntercept(List<List<num>> line){ var x = line[0][0]; var y = line[0][1]; return y - slope(line) * x; } bool isEqualLine(List<List<num>> line1, List<List<num>> line2){ return isEqual(line1.first, line2.first) && isEqual(line1.last, line2.last); } bool isEqual(List s1, List s2){ if(s1.length != s2.length){ return false; } int i; for(i = 0; i < s1.length; i += 1){ if(s1[i] != s2[i]){ return false; } } return true; } num min(num a, num b){ return a <= b ? a : b; } num max(num a, num b){ return a >= b ? a : b; }
0 コメント:
コメントを投稿