開発環境
- 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 コメント:
コメントを投稿