Created
October 9, 2009 08:36
-
-
Save hyuki0000/205868 to your computer and use it in GitHub Desktop.
"Coloring Pascal's Triangle" Applet. Visit http://www.hyuki.com/math/triangle/ for its live example.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
javac Triangle.java | |
appletviewer index.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<!DOCTYPE html PUBLIC | |
"-//W3C//DTD XHTML 1.0 Transitional//EN" | |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> | |
<head> | |
<title>パスカルの三角形に色を付けよう</title> | |
<style type="text/css"> | |
h2.section { | |
margin-top: 3em; | |
border-bottom: #66cc66 2px double; | |
padding: .5ex .5ex .5ex .5ex; | |
} | |
h3 { | |
margin-top: 3em; | |
border-bottom: #ccff99 1px solid; | |
padding: .5ex .5ex .5ex .5ex; | |
} | |
body { | |
font-family: Verdana; /* experimental */ | |
margin-right: 8%; | |
margin-left: 8%; | |
background-color: white; | |
color: black; | |
} | |
li, p { | |
line-height: 140%; | |
} | |
p { | |
margin-left: 1.0ex; | |
} | |
pre, ul { | |
line-height: 120%; | |
} | |
em { | |
font-weight: bold; | |
font-style: normal; | |
} | |
strong { | |
color: #f00; | |
background-color: transparent; | |
font-weight: bold; | |
} | |
a { | |
} | |
p a { | |
} | |
a:hover { | |
color: #66cc66; | |
background-color: #ffffcc; | |
/* text-decoration: none; */ | |
/* text-decoration: underline; */ | |
/* border-bottom: dashed 1px; */ | |
/* border-color: gray; */ | |
} | |
a[name]:hover { | |
color: black; | |
background-color: white; | |
} | |
.navi { | |
text-align: center; | |
} | |
.navigation { | |
padding: .3em 0 .3em .5em; | |
color: black; | |
background-color: transparent; | |
} | |
.navigation td { | |
white-space: nowrap; | |
} | |
.pathnavigation { | |
color: black; | |
background-color: #ccff99; | |
} | |
.localnavigation { | |
color: black; | |
background-color: #ffffcc; | |
} | |
strong.here { | |
color: black; | |
background-color: transparent; | |
font-weight: bold; | |
} | |
.footer { | |
margin-top: 3em; | |
padding-top: 1em; | |
} | |
</style> | |
</head> | |
<body> | |
<table summary="navi layout" border="0" cellpadding="5" cellspacing="0" width="100%" class="navigation"> | |
<tr class="pathnavigation"> | |
<td> | |
<a title="結城浩Webページトップ" href="http://www.hyuki.com/">ホーム</a> > | |
<a title="『プログラマの数学』" href="http://www.hyuki.com/math/">『プログラマの数学』</a> > | |
<strong class="here">パスカルの三角形に色を付けよう</strong> | |
</td><td align="right"> | |
<a href="http://www.hyuki.com/search/">検索</a> | | |
<a title="掲示板や主なページの最新情報がわかります" href="http://www.hyuki.com/whatsnew/">更新情報</a> | |
</td> | |
</tr> | |
<tr class="localnavigation"> | |
<td> | |
<a href="http://www.hyuki.com/girl/">数学ガール</a> | |
</td><td align="right"> | |
<a href="http://b.hatena.ne.jp/entry/http://www.hyuki.com/math/triangle/"><img | |
src="http://www.hyuki.com/diary/b_entry.gif" width="16" height="12" style="border: none;" | |
alt="このページを含む「はてなブックマーク」" | |
title="このページを含む「はてなブックマーク」" /></a> | |
</td> | |
</tr> | |
</table> | |
<h1 class="section">パスカルの三角形に色を付けよう</h1> | |
<object | |
classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" | |
codebase = "http://java.sun.com/update/1.6.0/jinstall-6u11-windows-i586.cab#Version=6,0,0,3" | |
WIDTH = "800" HEIGHT = "600" > | |
<PARAM NAME = CODE VALUE = "Triangle.class" > | |
<PARAM NAME = CODEBASE VALUE = "./" > | |
<param name = "type" value = "application/x-java-applet;version=1.6"> | |
<param name = "scriptable" value = "false"> | |
<comment> | |
<embed type = "application/x-java-applet;version=1.6" | |
CODE = "Triangle.class" | |
JAVA_CODEBASE = "./" | |
WIDTH = "800" | |
HEIGHT = "600" | |
scriptable = "false" | |
pluginspage = "http://java.sun.com/products/plugin/index.html#download"> | |
<noembed></noembed> | |
</embed> | |
</comment> | |
</object> | |
<h2 class="section">解説</h2> | |
<p> | |
こんにちは、結城浩です。 | |
このページでは、パスカルの三角形に色を付けて遊びます。 | |
</p> | |
<p> | |
「パスカルの三角形」は以下のような「数の三角形」です。 | |
</p> | |
<pre> | |
1 | |
1 1 | |
1 2 1 | |
1 3 3 1 | |
1 4 6 4 1 | |
.................... | |
</pre> | |
<p> | |
作り方は簡単。上に並んでいる二つの数を加えたものを書いていけばいいのです(両端は必ず 1 にします) | |
<pre> | |
1 ← 一番上は1と書く。 | |
1 1 ← 両端には1を書く。 | |
1 2 1 ← この行は、上の行から 1 1+1 1 として作られた。 | |
1 3 3 1 ← この行は、上の行から 1 1+2 2+1 1 として作られた。 | |
1 4 6 4 1 ← この行は、上の行から 1 1+3 3+3 3+1 1 として作られた。 | |
.................... | |
</pre> | |
<p> | |
このページでは、このようなパスカルの三角形を、 | |
「《ある数》で割り切れるかどうか」で色分けをしています。 | |
割り切れたなら薄いグリーン、割り切れないなら濃いグリーンになります。 | |
<p> | |
《ある数》は[Up][Down]で変更することができます。 | |
[Up]と[Down]のボタンを押して、どんなパターンが現れるかを観察してみましょう。 | |
</p> | |
<p> | |
おもしろいパターンは見つかりましたか? | |
そのとき《ある数》にはどんな特徴があるでしょうか? | |
</p> | |
<h2 class="section">結城浩の数学の本</h2> | |
<ul> | |
<li><a href="http://www.hyuki.com/math/">プログラマの数学</a></li> | |
<li><a href="http://www.hyuki.com/girl/">数学ガール</a>シリーズ</li> | |
</ul> | |
<h2 class="section"><a name="feed" id="feed">ぜひ、ご意見をお送りください</a></h2> | |
<p>あなたのご意見・感想をお送りください。 | |
あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。 | |
</p> | |
<form action="http://www.hyuki.com/cgi-bin/mail2.cgi" method="post"> | |
<p> | |
<input type="hidden" name="mycmd" value="send" /> | |
<input type="hidden" name="myhtml" value="http://www.hyuki.com/feed/minithankyou.html" /> | |
<input type="hidden" name="myformat" value="http://www.hyuki.com/feed/miniformat.txt" /> | |
<input type="hidden" name="mysubject" value="[MATH/triangle]" /> | |
あなたの名前:<input accesskey="1" tabindex="1" type="text" name="myname" value="" /> | |
メール:<input size="30" accesskey="2" tabindex="2" type="text" name="mysender" value="" /><br /> | |
学年・職業など:<input accesskey="3" tabindex="3" type="text" name="myjob" value="" /> | |
年齢:<input accesskey="4" tabindex="4" type="text" name="myage" value="" /> | |
<input accesskey="5" tabindex="5" type="radio" name="mysex" value="男性" />男性<input accesskey="6" tabindex="6" type="radio" name="mysex" value="女性" />女性<br /> | |
(上の情報は、いずれも未記入でかまいません)<br /> | |
<textarea accesskey="7" tabindex="7" rows="5" cols="60" name="mymessage">(お気軽にどうぞ)</textarea><br /> | |
お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。<br /> | |
<em>今年は西暦何年ですか?</em> | |
<input accesskey="8" tabindex="8" type="password" size="5" maxlength="4" id="mynospam" name="mynospam" value="" /><br /> | |
<input accesskey="9" tabindex="9" type="submit" value=" 送信する " /><br /> | |
</p> | |
<p> | |
何かの理由でうまく送れない場合にはメール<img style="vertical-align:middle" src="http://www.hyuki.com/images/mail.gif" alt="hyuki dot mail at hyuki dot com" width="180" height="24" />あてにお願いします。 | |
</p> | |
</form> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Triangle.java - "Coloring Pascal's Triangle" Applet. | |
// Copyright (C) 2009 Hiroshi Yuki. | |
// Visit http://www.hyuki.com/math/triangle/ for its live example. | |
import java.awt.*; | |
import java.awt.image.*; | |
import java.awt.event.*; | |
import java.applet.*; | |
public class Triangle extends Applet implements ActionListener { | |
private int R = 10; | |
private int _levels; | |
private int _modvalue = 1; | |
private Graphics2D _offscreenGraphics2D = null; | |
private final Label _label = new Label(" 0"); | |
private final Button _upButton = new Button("Up"); | |
private final Button _downButton = new Button("Down"); | |
private final Button _rPlusButton = new Button("R+"); | |
private final Button _rMinusButton = new Button("R-"); | |
public void init() { | |
_upButton.setFont(new Font(null, Font.PLAIN, 20)); | |
_downButton.setFont(new Font(null, Font.PLAIN, 20)); | |
_label.setFont(new Font(null, Font.PLAIN, 20)); | |
_rPlusButton.setFont(new Font(null, Font.PLAIN, 15)); | |
_rMinusButton.setFont(new Font(null, Font.PLAIN, 15)); | |
_upButton.addActionListener(this); | |
_downButton.addActionListener(this); | |
_rPlusButton.addActionListener(this); | |
_rMinusButton.addActionListener(this); | |
Panel buttons = new Panel(); | |
buttons.setLayout(new FlowLayout(FlowLayout.LEFT)); | |
buttons.add(_upButton); | |
buttons.add(_downButton); | |
buttons.add(_label); | |
setLayout(new FlowLayout(FlowLayout.LEFT)); | |
add(buttons); | |
Panel panel = new Panel(); | |
panel.setLayout(new FlowLayout(FlowLayout.LEFT)); | |
panel.add(_rPlusButton); | |
panel.add(_rMinusButton); | |
add(panel); | |
_label.setForeground(new Color(32,64,32)); | |
_upButton.setBackground(new Color(128,255,128)); | |
_downButton.setBackground(new Color(128,255,128)); | |
_rPlusButton.setBackground(new Color(128,255,128)); | |
_rMinusButton.setBackground(new Color(128,255,128)); | |
} | |
public void actionPerformed(ActionEvent e) { | |
if (e.getSource() == _upButton) { | |
if (_modvalue < 1000) { | |
_modvalue++; | |
} | |
} else if (e.getSource() == _downButton) { | |
if (_modvalue > 1) { | |
_modvalue--; | |
} | |
} else if (e.getSource() == _rPlusButton) { | |
if (R < 50) { | |
R++; | |
} | |
} else if (e.getSource() == _rMinusButton) { | |
if (R > 1) { | |
R--; | |
} | |
} | |
repaint(); | |
} | |
public void update(Graphics g) { | |
paint(g); | |
} | |
public void paint(Graphics g) { | |
_label.setText(String.valueOf(_modvalue) + "..."); | |
Dimension size = getSize(); | |
BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR); | |
_offscreenGraphics2D = img.createGraphics(); | |
if (_offscreenGraphics2D != null) { | |
_offscreenGraphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); | |
renderStage(); | |
g.drawImage(img, 0, 0, Color.white, this); | |
_offscreenGraphics2D = null; | |
} | |
_label.setText(String.valueOf(_modvalue)); | |
} | |
public void renderStage() { | |
Dimension d = getSize(); | |
_levels = d.height / R; | |
int[] a = new int[0]; | |
for (int yi = 0; yi < _levels; yi++) { | |
a = nextLine(a); | |
for (int xi = 0; xi <= yi; xi++) { | |
float alpha = (a[xi] % _modvalue == 0) ? 0.5f : 1.0f; | |
_offscreenGraphics2D.setBackground(Color.white); | |
_offscreenGraphics2D.setColor(new Color(0.1f, 0.5f, 0.1f, alpha)); | |
int x = (_levels - yi) * R / 2 + xi * R; | |
int y = yi * R; | |
_offscreenGraphics2D.fillOval(x, y, R, R); | |
} | |
} | |
} | |
private int[] nextLine(int[] a) { | |
int[] b = new int[a.length + 1]; | |
b[0] = 1; | |
for (int i = 0; i < a.length - 1; i++) { | |
b[i + 1] = (a[i] + a[i + 1]) % _modvalue; | |
} | |
b[a.length] = 1; | |
return b; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment