diff --git a/11.风扇.html b/11.风扇.html index 526ebe9..2f20258 100644 --- a/11.风扇.html +++ b/11.风扇.html @@ -32,8 +32,8 @@ stroke("rgba(128,128,255,0.8)"); fill("rgba(128,128,255,0.8)"); beginShape(); - for (let θ = 0; θ < 360; θ+=3) { - let d = r * sin(θ * 3); + for (let θ = 0; θ < 360; θ += 3) { + let d = r * sin(θ * 2); vertex(cos(θ) * d, -sin(θ) * d); } endShape(CLOSE); diff --git a/README.md b/README.md index 62815c8..9bc5579 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,29 @@ # p5js 学习仓库 +## 待做 + +- [分形树1](https://www.youtube.com/watch?v=0jjeOYMjmDU) +- [分形树5](https://www.youtube.com/watch?v=JcopTKXt8L8) +- [最小跨越树](https://www.youtube.com/watch?v=BxabnKrOjT0) +- [迷宫](https://www.youtube.com/watch?v=HyK_Q5rrcr4) +- [三维地形](https://www.youtube.com/watch?v=IKB1hWWedMk) +- [洛伦兹吸引子](https://www.youtube.com/watch?v=f0lkz2gSsIk) +- [反应扩散算法](https://www.youtube.com/watch?v=BV9ny785UNc) +- [超级椭圆](https://www.youtube.com/watch?v=z86cx2A4_3E) +- [3D织物](https://www.youtube.com/watch?v=jrk_lOg_pVA) +- [曼波集](https://www.youtube.com/watch?v=6z7GQewK-Ks) +- [茱莉亚集](https://www.youtube.com/watch?v=fAsaSkmbF5s) +- [合成器](https://www.youtube.com/watch?v=Bk8rLzzSink) +- [焰火](https://www.youtube.com/watch?v=ATWOjXdRIoo) +- [焰火2](https://www.youtube.com/watch?v=CKeyIbT3vXI) +- [计算机视觉](https://www.youtube.com/watch?v=nCVZHROb_dE) +- [WEBGL](https://www.youtube.com/watch?v=BrFZ5RkywcY) +- [遗传算法](https://www.youtube.com/watch?v=bGz7mv2vD6g) +- [Phyllotaxis](https://www.youtube.com/watch?v=KWoJgHFYWxY) +- [Flappy Bird and Agar.io Clones](https://www.youtube.com/watch?v=eOii4P7WYbY) +- [遗传算法:连续进化系统](https://www.youtube.com/watch?v=Sx_l2GxBC5w) +- [邮差算法](https://www.youtube.com/watch?v=r_SpBy9fQuo) + ## 链接 - [p5js官方网站](https://p5js.org/zh-Hans/) diff --git a/TEST.html b/TEST.html index 85b5b22..75e6307 100644 --- a/TEST.html +++ b/TEST.html @@ -5,19 +5,34 @@ -
+ Left-click to create an object. + Right-click to show next example. +
+ + ++ Box2DJS is a JavaScript port of Box2D Physics Engine. + To tell the truth, this is converted from Box2DFlashAS3_1.4.3.1 in an automatic manner. + (The reason why not Box2DFlashAS3_2.0.0 based is simply because I overlooked the renewal.) +
+ + ++ Because this libray does not have a lazy-loading system now, you should load all classes before starting your simulation. + To make things worse, each library has a bit complecated dependency each other so that loading libraries in wrong order may cause a fatal error. + To avoid such a trouble, it is strongly recomended to copy the header part of this file or `index.html' including the downloaded zip file. +
++ Concerning the Box2D APIs of the library, they are completely same as Box2DFlashAS3. Please google information about it. +
+ +var worldAABB = new b2AABB(); +worldAABB.minVertex.Set(-1000, -1000); +worldAABB.maxVertex.Set(1000, 1000); +var gravity = new b2Vec2(0, 300); +var doSleep = true; +var world = new b2World(worldAABB, gravity, doSleep);+ +
var circleSd = new b2CircleDef(); +circleSd.density = 1.0; +circleSd.radius = 20; +circleSd.restitution = 1.0; +circleSd.friction = 0; +var circleBd = new b2BodyDef(); +circleBd.AddShape(circleSd); +circleBd.position.Set(x,y); +var circleBody = world.CreateBody(circleBd);+ +
var jointDef = new b2RevoluteJointDef(); +jointDef.anchorPoint.Set(250, 200); +jointDef.body1 = world.GetGroundBody(); +jointDef.body2 = circleBody; +world.CreateJoint(jointDef);+ +
world.Step();+ + +
+ If you have some requests or find any bugs, please tell me about them.
+
and tags in your source with class=prettyprint.
+ * You can also use the (html deprecated) tag, but the pretty printer
+ * needs to do more substantial DOM manipulations to support that, so some
+ * css styles may not be preserved.
+ * That's it. I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in.
+ *
+ * Change log:
+ * cbeust, 2006/08/22
+ * Java annotations (start with "@") are now captured as literals ("lit")
+ */
+
+var PR_keywords = {};
+/** initialize the keyword list for our target languages. */
+(function () {
+ var CPP_KEYWORDS = "abstract bool break case catch char class const " +
+ "const_cast continue default delete deprecated dllexport dllimport do " +
+ "double dynamic_cast else enum explicit extern false float for friend " +
+ "goto if inline int long mutable naked namespace new noinline noreturn " +
+ "nothrow novtable operator private property protected public register " +
+ "reinterpret_cast return selectany short signed sizeof static " +
+ "static_cast struct switch template this thread throw true try typedef " +
+ "typeid typename union unsigned using declaration, directive uuid " +
+ "virtual void volatile while typeof";
+ var CSHARP_KEYWORDS = "as base by byte checked decimal delegate descending " +
+ "event finally fixed foreach from group implicit in interface internal " +
+ "into is lock null object out override orderby params readonly ref sbyte " +
+ "sealed stackalloc string select uint ulong unchecked unsafe ushort var";
+ var JAVA_KEYWORDS = "package synchronized boolean implements import throws " +
+ "instanceof transient extends final strictfp native super";
+ var JSCRIPT_KEYWORDS = "debugger export function with NaN Infinity";
+ var PERL_KEYWORDS = "require sub unless until use elsif BEGIN END";
+ var PYTHON_KEYWORDS = "and assert def del elif except exec global lambda " +
+ "not or pass print raise yield False True None";
+ var RUBY_KEYWORDS = "then end begin rescue ensure module when undef next " +
+ "redo retry alias defined";
+ var SH_KEYWORDS = "done fi";
+
+ var KEYWORDS = [CPP_KEYWORDS, CSHARP_KEYWORDS, JAVA_KEYWORDS,
+ JSCRIPT_KEYWORDS, PERL_KEYWORDS, PYTHON_KEYWORDS,
+ RUBY_KEYWORDS, SH_KEYWORDS];
+ for (var k = 0; k < KEYWORDS.length; k++) {
+ var kw = KEYWORDS[k].split(' ');
+ for (var i = 0; i < kw.length; i++) {
+ if (kw[i]) { PR_keywords[kw[i]] = true; }
+ }
+ }
+}).call(this);
+
+// token style names. correspond to css classes
+/** token style for a string literal */
+var PR_STRING = 'str';
+/** token style for a keyword */
+var PR_KEYWORD = 'kwd';
+/** token style for a comment */
+var PR_COMMENT = 'com';
+/** token style for a type */
+var PR_TYPE = 'typ';
+/** token style for a literal value. e.g. 1, null, true. */
+var PR_LITERAL = 'lit';
+/** token style for a punctuation string. */
+var PR_PUNCTUATION = 'pun';
+/** token style for a punctuation string. */
+var PR_PLAIN = 'pln';
+
+/** token style for an sgml tag. */
+var PR_TAG = 'tag';
+/** token style for a markup declaration such as a DOCTYPE. */
+var PR_DECLARATION = 'dec';
+/** token style for embedded source. */
+var PR_SOURCE = 'src';
+/** token style for an sgml attribute name. */
+var PR_ATTRIB_NAME = 'atn';
+/** token style for an sgml attribute value. */
+var PR_ATTRIB_VALUE = 'atv';
+
+/** the number of characters between tab columns */
+var PR_TAB_WIDTH = 8;
+
+function PR_isWordChar(ch) {
+ return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
+}
+
+function PR_isIE6() {
+ var isIE6 = navigator && navigator.userAgent
+ && /\bMSIE 6\./.test(navigator.userAgent);
+ PR_isIE6 = function () { return isIE6; }
+ return isIE6;
+}
+
+/** Splice one array into another.
+ * Like the python
+ * container[containerPosition:containerPosition + countReplaced] = inserted
+ *
+ * @param {Array} inserted
+ * @param {Array} container modified in place
+ * @param {Number} containerPosition
+ * @param {Number} countReplaced
+ */
+function PR_spliceArrayInto(
+ inserted, container, containerPosition, countReplaced) {
+ inserted.unshift(containerPosition, countReplaced || 0);
+ try {
+ container.splice.apply(container, inserted);
+ } finally {
+ inserted.splice(0, 2);
+ }
+}
+
+/** a set of tokens that can precede a regular expression literal in javascript.
+ * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
+ * list, but I've removed ones that might be problematic when seen in languages
+ * that don't support regular expression literals.
+ *
+ * Specifically, I've removed any keywords that can't precede a regexp
+ * literal in a syntactically legal javascript program, and I've removed the
+ * "in" keyword since it's not a keyword in many languages, and might be used
+ * as a count of inches.
+ * @private
+ */
+var REGEXP_PRECEDER_PATTERN = (function () {
+ var preceders = [
+ "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
+ "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
+ "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
+ "<", "<<", "<<=", "<=", "=", "==", "===", ">",
+ ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
+ "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
+ "||=", "~", "break", "case", "continue", "delete",
+ "do", "else", "finally", "instanceof",
+ "return", "throw", "try", "typeof"
+ ];
+ var pattern = '(?:' +
+ '(?:(?:^|[^0-9\.])\\.{1,3})|' + // a dot that's not part of a number
+ '(?:(?:^|[^\\+])\\+)|' + // allow + but not ++
+ '(?:(?:^|[^\\-])-)' // allow - but not --
+ ;
+ for (var i = 0; i < preceders.length; ++i) {
+ var preceder = preceders[i];
+ if (PR_isWordChar(preceder.charAt(0))) {
+ pattern += '|\\b' + preceder;
+ } else {
+ pattern += '|' + preceder.replace(/([^=<>:&])/g, '\\$1');
+ }
+ }
+ pattern += '|^)\\s*$'; // matches at end, and matches empty string
+ return new RegExp(pattern);
+ // CAVEAT: this does not properly handle the case where a regular expression
+ // immediately follows another since a regular expression may have flags
+ // for case-sensitivity and the like. Having regexp tokens adjacent is not
+ // valid in any language I'm aware of, so I'm punting.
+ // TODO: maybe style special characters inside a regexp as punctuation.
+ })();
+
+// Define regexps here so that the interpreter doesn't have to create an object
+// each time the function containing them is called.
+// The language spec requires a new object created even if you don't access the
+// $1 members.
+var pr_amp = /&/g;
+var pr_lt = //g;
+var pr_quot = /\"/g;
+/** like textToHtml but escapes double quotes to be attribute safe. */
+function PR_attribToHtml(str) {
+ return str.replace(pr_amp, '&')
+ .replace(pr_lt, '<')
+ .replace(pr_gt, '>')
+ .replace(pr_quot, '"');
+}
+
+/** escapest html special characters to html. */
+function PR_textToHtml(str) {
+ return str.replace(pr_amp, '&')
+ .replace(pr_lt, '<')
+ .replace(pr_gt, '>');
+}
+
+
+var pr_ltEnt = /</g;
+var pr_gtEnt = />/g;
+var pr_aposEnt = /'/g;
+var pr_quotEnt = /"/g;
+var pr_ampEnt = /&/g;
+/** unescapes html to plain text. */
+function PR_htmlToText(html) {
+ var pos = html.indexOf('&');
+ if (pos < 0) { return html; }
+ // Handle numeric entities specially. We can't use functional substitution
+ // since that doesn't work in older versions of Safari.
+ // These should be rare since most browsers convert them to normal chars.
+ for (--pos; (pos = html.indexOf('', pos + 1)) >= 0;) {
+ var end = html.indexOf(';', pos);
+ if (end >= 0) {
+ var num = html.substring(pos + 3, end);
+ var radix = 10;
+ if (num && num.charAt(0) == 'x') {
+ num = num.substring(1);
+ radix = 16;
+ }
+ var codePoint = parseInt(num, radix);
+ if (!isNaN(codePoint)) {
+ html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
+ html.substring(end + 1));
+ }
+ }
+ }
+
+ return html.replace(pr_ltEnt, '<')
+ .replace(pr_gtEnt, '>')
+ .replace(pr_aposEnt, "'")
+ .replace(pr_quotEnt, '"')
+ .replace(pr_ampEnt, '&');
+}
+
+/** is the given node's innerHTML normally unescaped? */
+function PR_isRawContent(node) {
+ return 'XMP' == node.tagName;
+}
+
+var PR_innerHtmlWorks = null;
+function PR_getInnerHtml(node) {
+ // inner html is hopelessly broken in Safari 2.0.4 when the content is
+ // an html description of well formed XML and the containing tag is a PRE
+ // tag, so we detect that case and emulate innerHTML.
+ if (null === PR_innerHtmlWorks) {
+ var testNode = document.createElement('PRE');
+ testNode.appendChild(
+ document.createTextNode('\n '));
+ PR_innerHtmlWorks = !/');
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ PR_normalizedHtml(child, out);
+ }
+ if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
+ out.push('<\/', name, '>');
+ }
+ break;
+ case 2: // an attribute
+ out.push(node.name.toLowerCase(), '="', PR_attribToHtml(node.value), '"');
+ break;
+ case 3: case 4: // text
+ out.push(PR_textToHtml(node.nodeValue));
+ break;
+ }
+}
+
+/** returns a function that expand tabs to spaces. This function can be fed
+ * successive chunks of text, and will maintain its own internal state to
+ * keep track of how tabs are expanded.
+ * @return {function (plainText : String) : String } a function that takes
+ * plain text and return the text with tabs expanded.
+ * @private
+ */
+function PR_tabExpander(tabWidth) {
+ var SPACES = ' ';
+ var charInLine = 0;
+
+ return function (plainText) {
+ // walk over each character looking for tabs and newlines.
+ // On tabs, expand them. On newlines, reset charInLine.
+ // Otherwise increment charInLine
+ var out = null;
+ var pos = 0;
+ for (var i = 0, n = plainText.length; i < n; ++i) {
+ var ch = plainText.charAt(i);
+
+ switch (ch) {
+ case '\t':
+ if (!out) { out = []; }
+ out.push(plainText.substring(pos, i));
+ // calculate how much space we need in front of this part
+ // nSpaces is the amount of padding -- the number of spaces needed to
+ // move us to the next column, where columns occur at factors of
+ // tabWidth.
+ var nSpaces = tabWidth - (charInLine % tabWidth);
+ charInLine += nSpaces;
+ for (; nSpaces >= 0; nSpaces -= SPACES.length) {
+ out.push(SPACES.substring(0, nSpaces));
+ }
+ pos = i + 1;
+ break;
+ case '\n':
+ charInLine = 0;
+ break;
+ default:
+ ++charInLine;
+ }
+ }
+ if (!out) { return plainText; }
+ out.push(plainText.substring(pos));
+ return out.join('');
+ };
+}
+
+// The below pattern matches one of the following
+// (1) /[^<]+/ : A run of characters other than '<'
+// (2) //: an HTML comment
+// (3) //: a cdata section
+// (3) /<\/?[a-zA-Z][^>]*>/ : A probably tag that should not be highlighted
+// (4) / : A '<' that does not begin a larger chunk. Treated as 1
+var pr_chunkPattern =
+ /(?:[^<]+|||<\/?[a-zA-Z][^>]*>|<)/g;
+var pr_commentPrefix = /^|$)/, null],
+ [PR_SOURCE, /^<\?[\s\S]*?(?:\?>|$)/, null],
+ [PR_SOURCE, /^<%[\s\S]*?(?:%>|$)/, null],
+ [PR_SOURCE,
+ // Tags whose content is not escaped, and which contain source code.
+ /^<(script|style|xmp)\b[^>]*>[\s\S]*?<\/\1\b[^>]*>/i, null],
+ [PR_TAG, /^<\/?\w[^<>]*>/, null]
+ ]);
+// Splits any of the source|style|xmp entries above into a start tag,
+// source content, and end tag.
+var PR_SOURCE_CHUNK_PARTS = /^(<[^>]*>)([\s\S]*)(<\/[^>]*>)$/;
+/** split markup on tags, comments, application directives, and other top level
+ * constructs. Tags are returned as a single token - attributes are not yet
+ * broken out.
+ * @private
+ */
+function PR_tokenizeMarkup(source) {
+ var decorations = PR_MARKUP_LEXER(source);
+ for (var i = 0; i < decorations.length; i += 2) {
+ if (decorations[i + 1] === PR_SOURCE) {
+ var start = decorations[i];
+ var end = i + 2 < decorations.length ? decorations[i + 2] : source.length;
+ // Split out start and end script tags as actual tags, and leave the body
+ // with style SCRIPT.
+ var sourceChunk = source.substring(start, end);
+ var match = (sourceChunk.match(PR_SOURCE_CHUNK_PARTS)
+ //|| sourceChunk.match(/^(<[?%])([\s\S]*)([?%]>)$/)
+ );
+ if (match) {
+ decorations.splice(
+ i, 2,
+ start, PR_TAG, // the open chunk
+ start + match[1].length, PR_SOURCE,
+ start + match[1].length + (match[2] || '').length, PR_TAG);
+ }
+ }
+ }
+ return decorations;
+}
+
+var PR_TAG_LEXER = PR_createSimpleLexer([
+ [PR_ATTRIB_VALUE, /^\'[^\']*(?:\'|$)/, null, "'"],
+ [PR_ATTRIB_VALUE, /^\"[^\"]*(?:\"|$)/, null, '"'],
+ [PR_PUNCTUATION, /^[<>\/=]+/, null, '<>/=']
+ ], [
+ [PR_TAG, /^[\w:-]+/, /^],
+ [PR_ATTRIB_VALUE, /^[\w-]+/, /^=/],
+ [PR_ATTRIB_NAME, /^[\w:-]+/, null],
+ [PR_PLAIN, /^\s+/, null, ' \t\r\n']
+ ]);
+/** split tags attributes and their values out from the tag name, and
+ * recursively lex source chunks.
+ * @private
+ */
+function PR_splitTagAttributes(source, decorations) {
+ for (var i = 0; i < decorations.length; i += 2) {
+ var style = decorations[i + 1];
+ if (style === PR_TAG) {
+ var start = decorations[i];
+ var end = i + 2 < decorations.length ? decorations[i + 2] : source.length;
+ var chunk = source.substring(start, end);
+ var subDecorations = PR_TAG_LEXER(chunk, start);
+ PR_spliceArrayInto(subDecorations, decorations, i, 2);
+ i += subDecorations.length - 2;
+ }
+ }
+ return decorations;
+}
+
+/** identify regions of markup that are really source code, and recursivley
+ * lex them.
+ * @private
+ */
+function PR_splitSourceNodes(source, decorations) {
+ for (var i = 0; i < decorations.length; i += 2) {
+ var style = decorations[i + 1];
+ if (style == PR_SOURCE) {
+ // Recurse using the non-markup lexer
+ var start = decorations[i];
+ var end = i + 2 < decorations.length ? decorations[i + 2] : source.length;
+ var subDecorations = PR_decorateSource(source.substring(start, end));
+ for (var j = 0, m = subDecorations.length; j < m; j += 2) {
+ subDecorations[j] += start;
+ }
+ PR_spliceArrayInto(subDecorations, decorations, i, 2);
+ i += subDecorations.length - 2;
+ }
+ }
+ return decorations;
+}
+
+/** identify attribute values that really contain source code and recursively
+ * lex them.
+ * @private
+ */
+function PR_splitSourceAttributes(source, decorations) {
+ var nextValueIsSource = false;
+ for (var i = 0; i < decorations.length; i += 2) {
+ var style = decorations[i + 1];
+ if (style === PR_ATTRIB_NAME) {
+ var start = decorations[i];
+ var end = i + 2 < decorations.length ? decorations[i + 2] : source.length;
+ nextValueIsSource = /^on|^style$/i.test(source.substring(start, end));
+ } else if (style == PR_ATTRIB_VALUE) {
+ if (nextValueIsSource) {
+ var start = decorations[i];
+ var end
+ = i + 2 < decorations.length ? decorations[i + 2] : source.length;
+ var attribValue = source.substring(start, end);
+ var attribLen = attribValue.length;
+ var quoted =
+ (attribLen >= 2 && /^[\"\']/.test(attribValue) &&
+ attribValue.charAt(0) === attribValue.charAt(attribLen - 1));
+
+ var attribSource;
+ var attribSourceStart;
+ var attribSourceEnd;
+ if (quoted) {
+ attribSourceStart = start + 1;
+ attribSourceEnd = end - 1;
+ attribSource = attribValue;
+ } else {
+ attribSourceStart = start + 1;
+ attribSourceEnd = end - 1;
+ attribSource = attribValue.substring(1, attribValue.length - 1);
+ }
+
+ var attribSourceDecorations = PR_decorateSource(attribSource);
+ for (var j = 0, m = attribSourceDecorations.length; j < m; j += 2) {
+ attribSourceDecorations[j] += attribSourceStart;
+ }
+
+ if (quoted) {
+ attribSourceDecorations.push(attribSourceEnd, PR_ATTRIB_VALUE);
+ PR_spliceArrayInto(attribSourceDecorations, decorations, i + 2, 0);
+ } else {
+ PR_spliceArrayInto(attribSourceDecorations, decorations, i, 2);
+ }
+ }
+ nextValueIsSource = false;
+ }
+ }
+ return decorations;
+}
+
+/** returns a list of decorations, where even entries
+ *
+ * This code treats ", ', and ` as string delimiters, and \ as a string escape.
+ * It does not recognize perl's qq() style strings. It has no special handling
+ * for double delimiter escapes as in basic, or tje tripled delimiters used in
+ * python, but should work on those regardless although in those cases a single
+ * string literal may be broken up into multiple adjacent string literals.
+ *
+ * It recognizes C, C++, and shell style comments.
+ *
+ * @param {String} sourceCode as plain text
+ * @return {Array.} a decoration list
+ */
+function PR_decorateSource(sourceCode) {
+ // Split into strings, comments, and other.
+ // We do this because strings and comments are easily recognizable and can
+ // contain stuff that looks like other tokens, so we want to mark those early
+ // so we don't recurse into them.
+ var decorations = PR_splitStringAndCommentTokens(sourceCode);
+
+ // Split non comment|string tokens on whitespace and word boundaries
+ decorations = PR_splitNonStringNonCommentTokens(sourceCode, decorations);
+
+ return decorations;
+}
+
+/** returns a decoration list given a string of markup.
+ *
+ * This code recognizes a number of constructs.
+ * comment
+ * declaration
+ * <\w ... > tag
+ * \w ... > tag
+ * ...?> embedded source
+ * <%...%> embedded source
+ * &[#\w]...; entity
+ *
+ * It does not recognizes %foo; doctype entities from .
+ *
+ * It will recurse into any