diff --git a/README.md b/README.md index 5c11c1e..cb0caee 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # TAKE THE STREET -![Calle en perspectiva con gente saliendo de los portales](docs/calle.svg) +![Take the Street](docs/marca/logotipo-naranja.svg) + +![Una multitud en la calle forma una persona grande con el puño en alto](docs/calle.svg) **takethestreet.net / takethestreet.org**: red internacional de las acampadas por la vivienda que nacieron en la Puerta del Sol el 26 de septiembre de 2026 (26S). La vivienda es un derecho, no un negocio. @@ -110,18 +112,43 @@ Sin cuenta todavía: Granada, Oviedo, Alicante, Lanzarote, Tenerife, Las Palmas, Las personas de enlace de cada ciudad no se ponen aquí: van en la sala cerrada del deck. -## 5. Maqueta +## 5. Identidad -`mockup/index.html` es HTML y CSS, sin JavaScript. Se abre directamente en el navegador. Sigue el estilo de acampada26s.net (blanco y negro, bordes de 3 px, sombra de color), pero con otras tipografías: +Tres piezas, cada una con su uso: -- títulos: **New Rocker** (gótica de cartel de rock, sin pasarse), OFL -- etiquetas: **Special Elite** (máquina de escribir de fanzine), Apache 2.0 -- botones: **Anton**, OFL, la misma que 26s +![Hoja de marca](docs/marca/hoja.png) -El color es el naranja `#ff7a1a`. El dibujo `docs/calle.svg` es una calle en perspectiva con gente saliendo de los portales. La calzada, el bordillo, la acera y el paso de cebra van con línea limpia; los edificios, a mano alzada; y la gente, con trazo suelto de spray. Se genera con `tools/calle.py`, sin dependencias. Para regenerarlo: +- **Símbolo** (`docs/marca/simbolo*.svg`): una calle en perspectiva con una cabeza encima. La calle es el cuerpo de una persona: la gente es la calle. Repite la forma de las presencias del dibujo (cabeza y cuerpo afilado). Sirve para el favicon, los avatares de redes y las pegatinas, y se lee hasta a 16 px. Tres versiones: positivo, negativo y sobre naranja. +- **Logotipo** (`docs/marca/logotipo*.svg`): «TAKE THE STREET» en **Dracutaz**, de pincel, como la calle pintada. Va convertido a trazados, así que no hace falta la fuente. Hay versión en una línea y en dos, en negro, con STREET en naranja y en negativo. +- **Firma**: símbolo + logotipo. Es lo que va arriba a la izquierda de la web. +- **Ilustración** (`docs/calle.svg`): la imagen principal de la portada, nunca en la cabecera. Ver el apartado 6. + +Color: naranja `#ff7a1a`, negro `#111` y blanco. + +Tipografías: + +- logotipo: **Dracutaz** (Dhabee Studio, freeware, uso comercial permitido), solo convertida a trazados +- titulares, botones y etiquetas: **League Gothic**, OFL (`mockup/fonts/`) +- texto: la fuente del sistema + +### Alternativas para el logotipo + +![Alternativas de pincel](docs/marca/alternativas.png) + +Grindy Brush, Eagle Horizon, Brushed, Higher Jump y Future Outrun (1001fonts) son **solo para uso personal**. Para usarlas en el logotipo habría que comprar la licencia o pedir permiso a sus autores. Dracutaz no tiene ese problema. + +## 6. Dibujo + +![Una multitud en la calle forma una persona grande con el puño en alto](docs/calle.svg) + +Una calle pintada a brochazos que se disuelve hacia arriba y hacia los lados, sin edificios. Encima, cientos de «presencias» (cabeza, cuerpo afilado y una sombra en diagonal), a la manera del mural *Presencias/Ausencias* de Suso33 en Tetuán: juntas forman una persona grande con el puño en alto. Unas pocas van en naranja. Se genera con `tools/calle.py`, sin dependencias: ``` python3 tools/calle.py docs/calle.svg ``` -Código AGPL-3.0. Textos y dibujo CC BY-SA 4.0. Tipografías: New Rocker y Anton (OFL), Special Elite (Apache 2.0). +## 7. Maqueta + +`mockup/index.html` es HTML y CSS, sin JavaScript. Se abre directamente en el navegador. Sigue el estilo de acampada26s.net (blanco y negro, bordes de 3 px, sombra de color): firma en la cabecera, portada con el lema y el dibujo, y debajo el deck.Capturas al principio de este README. + +Código AGPL-3.0. Textos y dibujo CC BY-SA 4.0. Tipografías: League Gothic (OFL); logotipo dibujado con Dracutaz (freeware). diff --git a/docs/calle.svg b/docs/calle.svg index d02dd4a..002beae 100644 --- a/docs/calle.svg +++ b/docs/calle.svg @@ -1,1431 +1,1179 @@ - + - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/deck-movil.png b/docs/deck-movil.png index f1010e5..f74483b 100644 Binary files a/docs/deck-movil.png and b/docs/deck-movil.png differ diff --git a/docs/deck.png b/docs/deck.png index fb4fdf2..5d880aa 100644 Binary files a/docs/deck.png and b/docs/deck.png differ diff --git a/docs/marca/alternativas.png b/docs/marca/alternativas.png new file mode 100644 index 0000000..9b36c1c Binary files /dev/null and b/docs/marca/alternativas.png differ diff --git a/docs/marca/hoja.png b/docs/marca/hoja.png new file mode 100644 index 0000000..77491be Binary files /dev/null and b/docs/marca/hoja.png differ diff --git a/docs/marca/logotipo-2l.svg b/docs/marca/logotipo-2l.svg new file mode 100644 index 0000000..da92b77 --- /dev/null +++ b/docs/marca/logotipo-2l.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/logotipo-naranja-2l.svg b/docs/marca/logotipo-naranja-2l.svg new file mode 100644 index 0000000..3b4e7da --- /dev/null +++ b/docs/marca/logotipo-naranja-2l.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/logotipo-naranja.svg b/docs/marca/logotipo-naranja.svg new file mode 100644 index 0000000..1f2ffe9 --- /dev/null +++ b/docs/marca/logotipo-naranja.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/logotipo-negativo-2l.svg b/docs/marca/logotipo-negativo-2l.svg new file mode 100644 index 0000000..584ccb3 --- /dev/null +++ b/docs/marca/logotipo-negativo-2l.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/logotipo-negativo.svg b/docs/marca/logotipo-negativo.svg new file mode 100644 index 0000000..1d32cf8 --- /dev/null +++ b/docs/marca/logotipo-negativo.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/logotipo.svg b/docs/marca/logotipo.svg new file mode 100644 index 0000000..9abb1fa --- /dev/null +++ b/docs/marca/logotipo.svg @@ -0,0 +1 @@ + diff --git a/docs/marca/simbolo-naranja.svg b/docs/marca/simbolo-naranja.svg new file mode 100644 index 0000000..789fd25 --- /dev/null +++ b/docs/marca/simbolo-naranja.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/marca/simbolo-negativo.svg b/docs/marca/simbolo-negativo.svg new file mode 100644 index 0000000..ac50856 --- /dev/null +++ b/docs/marca/simbolo-negativo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/marca/simbolo.svg b/docs/marca/simbolo.svg new file mode 100644 index 0000000..4f2b374 --- /dev/null +++ b/docs/marca/simbolo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mockup/css/deck.css b/mockup/css/deck.css index 2807693..93052d0 100644 --- a/mockup/css/deck.css +++ b/mockup/css/deck.css @@ -1,15 +1,11 @@ -@font-face { font-family: "New Rocker"; src: url("../fonts/new-rocker.woff2") format("woff2"); font-display: swap; } -@font-face { font-family: "Special Elite"; src: url("../fonts/special-elite.woff2") format("woff2"); font-display: swap; } -@font-face { font-family: "Anton"; src: url("../fonts/anton.woff2") format("woff2"); font-display: swap; } +@font-face { font-family: "League Gothic"; src: url("../fonts/league-gothic.ttf") format("truetype"); font-display: swap; } :root { --bg: #fff; - --fg: #000; + --fg: #111; --neon: #ff7a1a; --bd: 3px solid var(--fg); - --tit: "New Rocker", "Old English Text MT", Georgia, serif; - --zine: "Special Elite", "Courier New", monospace; - --bt: "Anton", Impact, "Arial Narrow", sans-serif; + --bt: "League Gothic", "Arial Narrow", Impact, sans-serif; --txt: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; } @@ -18,31 +14,32 @@ body { margin: 0; background: var(--bg); color: var(--fg); font: 15px/1.45 var(- a { color: inherit; } .cab { - display: grid; - grid-template-columns: 340px 1fr auto; + display: flex; + justify-content: space-between; align-items: center; gap: 20px; padding: 10px 20px; border-bottom: var(--bd); } -.cab img { width: 100%; height: auto; display: block; } -h1 { - margin: 0; - font: 400 clamp(44px, 6.5vw, 96px)/1 var(--tit); - text-shadow: .03em .03em 0 var(--neon), .06em .06em 0 var(--neon); -} -.lema { margin: 22px 0 0; font: 18px var(--zine); } -.idiomas { display: flex; gap: 6px; font: 16px var(--bt); } -.idiomas a { border: var(--bd); border-radius: 6px; padding: 2px 8px; text-decoration: none; box-shadow: 3px 3px 0 var(--fg); } +.firma { display: flex; align-items: center; gap: 12px; } +.firma .simbolo { height: 52px; } +.firma .logotipo { height: 34px; } +.idiomas { display: flex; gap: 6px; font: 20px/1 var(--bt); letter-spacing: .04em; } +.idiomas a { border: var(--bd); border-radius: 6px; padding: 4px 9px 2px; text-decoration: none; box-shadow: 3px 3px 0 var(--fg); } .idiomas a[aria-current] { background: var(--fg); color: var(--bg); box-shadow: 3px 3px 0 var(--neon); } -.tags { display: flex; gap: 8px; flex-wrap: wrap; padding: 10px 20px; border-bottom: var(--bd); font: 15px var(--zine); } +.portada { padding: 36px 0 0; border-bottom: var(--bd); text-align: center; } +.calle { display: block; width: 100%; max-width: 1100px; height: auto; margin: -10px auto 0; } +.lema { margin: 0; font: 400 clamp(40px, 6vw, 80px)/.95 var(--bt); text-transform: uppercase; } +.sub { margin: 10px 0 0; font: 20px var(--bt); letter-spacing: .12em; text-transform: uppercase; color: var(--neon); } + +.tags { display: flex; gap: 8px; flex-wrap: wrap; padding: 10px 20px; border-bottom: var(--bd); font: 18px var(--bt); letter-spacing: .03em; } .tags span { border: 2px dashed var(--fg); padding: 1px 8px; } .tags span:first-child { background: var(--neon); color: #fff; border-style: solid; } .deck { display: grid; grid-template-columns: 220px 1fr; min-height: 70vh; } -.arbol { border-right: var(--bd); padding: 14px 16px; font: 15px/1.7 var(--zine); } +.arbol { border-right: var(--bd); padding: 14px 16px; font: 15px/1.7 var(--txt); } .arbol h2, .col h2 { font: 400 22px/1 var(--bt); text-transform: uppercase; margin: 0 0 10px; } .arbol ul { list-style: none; margin: 0; padding: 0 0 0 14px; border-left: 2px solid var(--fg); } .arbol > ul { padding: 0; border: 0; } @@ -52,26 +49,28 @@ h1 { .cols { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(260px, 1fr); overflow-x: auto; } .col { border-right: var(--bd); padding: 14px 12px; } .col h2 { display: flex; justify-content: space-between; align-items: baseline; border-bottom: var(--bd); padding-bottom: 6px; } -.col h2 small { font: 13px var(--zine); text-transform: none; } +.col h2 small { font: 13px var(--txt); text-transform: none; } .post { border: var(--bd); border-radius: 8px; padding: 10px 12px; margin: 0 0 12px; box-shadow: 4px 4px 0 var(--fg); } .post p { margin: 6px 0 0; } -.meta { display: flex; gap: 8px; justify-content: space-between; font: 13px var(--zine); } +.meta { display: flex; gap: 8px; justify-content: space-between; font: 13px var(--txt); } .red { white-space: nowrap; font: 12px/1 var(--bt); text-transform: uppercase; border: 2px solid var(--fg); border-radius: 4px; padding: 2px 5px; } .post.cola { box-shadow: 4px 4px 0 var(--neon); } -.votos { margin-top: 8px; display: flex; gap: 6px; align-items: center; font: 13px var(--zine); } +.votos { margin-top: 8px; display: flex; gap: 6px; align-items: center; font: 13px var(--txt); } .votos b { font: 14px var(--bt); border: 2px solid var(--fg); border-radius: 4px; padding: 1px 8px; } .votos b.si { background: var(--fg); color: var(--bg); } .directo { background: var(--fg); color: var(--bg); } .directo .red { border-color: var(--neon); background: var(--neon); color: #fff; } -.mapa { font: 14px/1.6 var(--zine); margin: 0; padding: 0; list-style: none; } +.mapa { font: 14px/1.6 var(--txt); margin: 0; padding: 0; list-style: none; } .mapa li { display: flex; justify-content: space-between; border-bottom: 1px dashed var(--fg); } .mapa .ko { text-decoration: line-through; } @media (max-width: 700px) { - .cab { grid-template-columns: 1fr; text-align: center; padding: 10px 12px; } - .cab img { max-width: 360px; margin: 0 auto; } - .idiomas { justify-content: center; } + .cab { flex-direction: column; padding: 10px 12px; } + .firma .simbolo { height: 40px; } + .firma .logotipo { height: 26px; } + .portada { padding-top: 20px; } + .calle { width: 150%; margin: 0 0 0 -25%; max-width: none; } .tags { padding: 8px 12px; font-size: 13px; } .deck { grid-template-columns: 1fr; } .arbol { display: none; } diff --git a/mockup/fonts/LICENSE-special-elite.txt b/mockup/fonts/LICENSE-special-elite.txt deleted file mode 100644 index d645695..0000000 --- a/mockup/fonts/LICENSE-special-elite.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/mockup/fonts/OFL-anton.txt b/mockup/fonts/OFL-league-gothic.txt similarity index 95% rename from mockup/fonts/OFL-anton.txt rename to mockup/fonts/OFL-league-gothic.txt index 93fedde..06b467d 100644 --- a/mockup/fonts/OFL-anton.txt +++ b/mockup/fonts/OFL-league-gothic.txt @@ -1,93 +1,93 @@ -Copyright 2020 The Anton Project Authors (https://github.com/googlefonts/AntonFont.git) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. +Copyright 2010 The League Gothic Project Authors (https://github.com/theleagueof/league-gothic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/mockup/fonts/OFL-new-rocker.txt b/mockup/fonts/OFL-new-rocker.txt deleted file mode 100644 index 60e2779..0000000 --- a/mockup/fonts/OFL-new-rocker.txt +++ /dev/null @@ -1,96 +0,0 @@ -Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), -Copyright (c) 2011, Brenda Gallo (gbrenda1987@gmail.com), -Copyright (c) 2011, Rodrigo Fuenzalida (www.rfuenzalida.com|hello@rfuenzalida.com), -with Reserved Font Name 'New Rocker' - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/mockup/fonts/anton.woff2 b/mockup/fonts/anton.woff2 deleted file mode 100644 index 46fd713..0000000 Binary files a/mockup/fonts/anton.woff2 and /dev/null differ diff --git a/mockup/fonts/league-gothic.ttf b/mockup/fonts/league-gothic.ttf new file mode 100644 index 0000000..2543bb2 Binary files /dev/null and b/mockup/fonts/league-gothic.ttf differ diff --git a/mockup/fonts/new-rocker.woff2 b/mockup/fonts/new-rocker.woff2 deleted file mode 100644 index ff6bcb3..0000000 Binary files a/mockup/fonts/new-rocker.woff2 and /dev/null differ diff --git a/mockup/fonts/special-elite.woff2 b/mockup/fonts/special-elite.woff2 deleted file mode 100644 index 3881372..0000000 Binary files a/mockup/fonts/special-elite.woff2 and /dev/null differ diff --git a/mockup/index.html b/mockup/index.html index 3c8e337..e519abc 100644 --- a/mockup/index.html +++ b/mockup/index.html @@ -4,18 +4,21 @@ TAKE THE STREET · deck (maqueta) +
- Calle en perspectiva con gente saliendo de los portales -
-

Take the Street

-

La vivienda es un derecho, no un negocio · red internacional de acampadas

-
+ Take the Street
+
+

La vivienda es un derecho,
no un negocio

+

Red internacional de acampadas · 26S

+ Una multitud en la calle forma una persona grande con el puño en alto +
+
#takethestreet#26s#acampadaporto#generazionesenzacasa#11N#viviendaya
diff --git a/tools/calle.py b/tools/calle.py index f591ec9..908d3c7 100644 --- a/tools/calle.py +++ b/tools/calle.py @@ -1,156 +1,108 @@ -# Genera docs/calle.svg: calle en perspectiva, gente saliendo de los portales. -# Calzada y acera con líneas limpias; edificios a mano alzada; gente con trazo difuso. +# Genera docs/calle.svg: calle pintada que se disuelve, con «presencias» que, +# juntas, forman una figura grande con el puño en alto (a la manera de Suso33). import sys, random, math -random.seed(1310) +random.seed(26) OUT = sys.argv[1] -W, H = 1200, 640 -VX, VY, F = 600, 205, 500 # punto de fuga y focal -EYE = 4.0 # cámara a 4 m (desde un balcón) -ROAD, WALK, TOP = 3.4, 6.6, -16.0 # medio ancho calzada, fachada, altura +W, H = 1600, 900 +VX, VY = 800, 70 # punto de fuga INK, ORA = "#111", "#ff7a1a" o = [] add = o.append -def P(X, Y, Z): # Y hacia abajo, suelo en Y = EYE - return VX + X * F / Z, VY + Y * F / Z -def poly(pts, **a): - d = "M" + " L".join(f"{x:.1f},{y:.1f}" for x, y in pts) + "Z" - add(f'") -def line(p, q, w, filt=None, col=INK, op=1): - f = f' filter="url(#{filt})"' if filt else "" - add(f'') +def esc(y): # tamaño según la distancia + return max(0.0, (y - VY) / (H - VY)) -ZN, ZF = 4.4, 400.0 -add(f'') +def edge(xb, y): # x de una recta que va del punto de fuga a (xb, H) + return VX + (xb - VX) * esc(y) + +Y0 = 210 # lo de arriba queda en blanco: se recorta +add(f'') add(''' - - - - - + + + + + + + + + + ''') -add(f'') -# luz naranja al fondo de la calle -add(f'') -add(f'') -for _ in range(28): - a = random.uniform(0, 2*math.pi); r = random.uniform(30, 190) - add(f'') -add('') +# --- calle pintada: todo dentro de la máscara que la disipa --- +add('') +road = [(VX, VY), (edge(-150, H), H), (edge(1750, H), H)] +add(f'') +def brush(x0, y0, x1, y1, w, n, col=INK, op=.85): + for _ in range(n): + j = lambda: random.uniform(-w, w) * .5 + add(f'') +add('') +for xb, w in ((-150, 26), (1750, 26)): # bordillos + y0 = VY + 40 + brush(edge(xb, y0), y0, xb, H + 30, w, 7) +add('') -# --- fachadas (a mano alzada) --- -def fachada(s): - X = s * WALK - # línea de cornisas / pisos - for Y in (EYE - 3.2, EYE - 6.8, EYE - 10.4, EYE - 14.0): - line(P(X, Y, ZN), P(X, Y, ZF), 2.2, "lapiz") - # aristas verticales de los portales y ventanas - z = ZN + 1.2 - i = 0 - while z < 90: - dz = 1.5 - # portal - poly([P(X, EYE, z), P(X, EYE - 2.6, z), P(X, EYE - 2.6, z + dz), P(X, EYE, z + dz)], - fill=ORA if i % 2 == 0 else "#fff", stroke=INK, stroke_width=f"{max(1.2, 30/z):.1f}", filter="url(#lapiz)") - if i % 2 == 1: - poly([P(X, EYE, z+.2), P(X, EYE - 2.4, z+.2), P(X, EYE - 2.4, z + dz-.2), P(X, EYE, z + dz-.2)], fill=INK, opacity=".85", filter="url(#lapiz)") - # ventanas encima - for Yb in (EYE - 4.2, EYE - 7.8, EYE - 11.4): - poly([P(X, Yb, z+.15), P(X, Yb - 1.8, z+.15), P(X, Yb - 1.8, z + dz-.15), P(X, Yb, z + dz-.15)], - fill="none", stroke=INK, stroke_width=f"{max(.8, 18/z):.1f}", filter="url(#lapiz)") - z += dz + 2.2 + z * .12 - i += 1 -fachada(-1); fachada(1) +# --- figura grande: siluetas sencillas en coordenadas de la imagen --- +def cap(px, py, ax, ay, bx, by, r): # cápsula (segmento con radio) + dx, dy = bx - ax, by - ay + t = max(0, min(1, ((px - ax) * dx + (py - ay) * dy) / (dx * dx + dy * dy))) + return math.hypot(px - (ax + t * dx), py - (ay + t * dy)) < r +K, YT = .8, 250 # escala y altura de la figura +def dentro(x, y): + x, y = 800 + (x - 800) / K, 60 + (y - YT) / K + return (math.hypot(x - 772, (y - 205) * .9) < 56 or # cabeza + cap(x, y, 790, 372, 815, 560, 88) or # tronco + cap(x, y, 735, 360, 590, 270, 34) or cap(x, y, 590, 270, 560, 150, 32) or # brazo en alto + math.hypot(x - 556, y - 128) < 46 or # puño + cap(x, y, 880, 360, 960, 470, 32) or cap(x, y, 960, 470, 935, 585, 30) or # brazo bajo + cap(x, y, 770, 590, 700, 735, 44) or cap(x, y, 700, 735, 650, 870, 40) or # pierna + cap(x, y, 860, 590, 940, 720, 44) or cap(x, y, 940, 720, 1010, 860, 40)) # pierna -# --- acera y calzada (líneas limpias) --- -for s in (-1, 1): - # acera (gris claro) y bordillo - poly([P(s*ROAD, EYE-.15, ZN), P(s*WALK, EYE-.15, ZN), P(s*WALK, EYE-.15, ZF), P(s*ROAD, EYE-.15, ZF)], fill="#f2f2f2") - poly([P(s*ROAD, EYE-.15, ZN), P(s*ROAD, EYE, ZN), P(s*ROAD, EYE, ZF), P(s*ROAD, EYE-.15, ZF)], fill=INK) - line(P(s*ROAD, EYE-.15, ZN), P(s*ROAD, EYE-.15, ZF), 3) - line(P(s*WALK, EYE, ZN), P(s*WALK, EYE, ZF), 3) - # juntas de las baldosas - z = ZN - while z < 120: - line(P(s*ROAD, EYE-.15, z), P(s*WALK, EYE-.15, z), max(.6, 9/z)) - z *= 1.12 - for k in (1, 2): - Xk = s * (ROAD + (WALK - ROAD) * k / 3) - line(P(Xk, EYE-.15, ZN), P(Xk, EYE-.15, ZF), .8, op=.6) -# línea discontinua central -z = ZN -while z < 200: - poly([P(-.08, EYE, z), P(.08, EYE, z), P(.08, EYE, z+2.2), P(-.08, EYE, z+2.2)], fill=INK) - z += 2.2 + 2.6 + z * .08 -# bordes de la calzada -for s in (-1, 1): - line(P(s*(ROAD-.25), EYE, ZN), P(s*(ROAD-.25), EYE, ZF), 2.4) -# paso de cebra delante -for i in range(-6, 7): - x0 = i * .52 - poly([P(x0-.2, EYE, ZN+.2), P(x0+.2, EYE, ZN+.2), P(x0+.2, EYE, ZN+2.6), P(x0-.2, EYE, ZN+2.6)], fill=INK) - -# --- gente (trazo difuso) --- -def persona(X, Z, col=INK, pose=None): - x, y = P(X, EYE, Z) - h = 1.72 * F / Z - if pose is None: - pose = random.choice(["anda", "anda", "puño", "brazos", "anda"]) - paso = random.uniform(-1, 1) - w = max(1.1, .042 * h) - hd = (x + random.uniform(-.02, .02) * h, y - .9 * h) - nk, hip = (x, y - .8 * h), (x + paso * .01 * h, y - .48 * h) - sh_l, sh_r = (x - .11 * h, y - .78 * h), (x + .11 * h, y - .78 * h) - pie_l, pie_r = (x - .05*h - paso*.08*h, y), (x + .05*h + paso*.08*h, y) - rod_l, rod_r = (x - .04*h - paso*.04*h, y - .25*h), (x + .04*h + paso*.05*h, y - .25*h) - if pose == "puño": - m_l, c_l = (x - .14*h, y - .46*h), (x - .15*h, y - .62*h) - m_r, c_r = (x + .1*h, y - 1.18*h), (x + .17*h, y - .98*h) - elif pose == "brazos": - m_l, c_l = (x - .26*h, y - 1.12*h), (x - .2*h, y - .95*h) - m_r, c_r = (x + .26*h, y - 1.12*h), (x + .2*h, y - .95*h) +# --- presencias --- +def presencia(x, y, s, col): + h = 46 * s # alto de la figura + r = h * random.uniform(.10, .13) # cabeza + lean = random.uniform(-.12, .12) * h + w = h * random.uniform(.13, .19) # hombros + fx = x + lean # pies + # sombra hacia abajo a la derecha + L = h * random.uniform(.9, 1.3) + add(f'') + sx, sy = x, y - h + 2 * r # hombros + split = random.random() < .35 # piernas abiertas al andar + if split: + d = (f'M{sx-w/2:.1f},{sy:.1f} Q{sx-w*.55:.1f},{sy+h*.35:.1f} {fx-w*.32:.1f},{y:.1f} ' + f'L{fx-w*.12:.1f},{y:.1f} L{fx:.1f},{y-h*.3:.1f} L{fx+w*.12:.1f},{y:.1f} L{fx+w*.32:.1f},{y:.1f} ' + f'Q{sx+w*.55:.1f},{sy+h*.35:.1f} {sx+w/2:.1f},{sy:.1f} Z') else: - m_l, c_l = (x - .15*h - paso*.05*h, y - .44*h), (x - .16*h, y - .6*h) - m_r, c_r = (x + .15*h + paso*.05*h, y - .44*h), (x + .16*h, y - .6*h) - def tr(*pts, ww): - d = "M" + " L".join(f"{a+random.uniform(-.6,.6):.1f},{b+random.uniform(-.6,.6):.1f}" for a, b in pts) - add(f'') - for pas in range(2): # dos pasadas desplazadas = trazo suelto - ww = w * (1 if pas == 0 else .6) - dx, dy = (0, 0) if pas == 0 else (random.uniform(-.03, .03) * h, random.uniform(-.02, .02) * h) - add(f'') - tr(nk, hip, ww=ww * 1.5) - tr(hip, rod_l, pie_l, ww=ww) - tr(hip, rod_r, pie_r, ww=ww) - tr(sh_l, c_l, m_l, ww=ww * .85) - tr(sh_r, c_r, m_r, ww=ww * .85) - tr(sh_l, sh_r, ww=ww * 1.2) - add(f'') - add('') + d = (f'M{sx-w/2:.1f},{sy:.1f} Q{sx-w*.45:.1f},{sy+h*.45:.1f} {fx-w*.1:.1f},{y:.1f} ' + f'L{fx+w*.1:.1f},{y:.1f} Q{sx+w*.45:.1f},{sy+h*.45:.1f} {sx+w/2:.1f},{sy:.1f} Z') + add(f'') + add(f'') -gente = [] -# saliendo de los portales (en la acera) -for s in (-1, 1): - z = ZN + 1.2; i = 0 - while z < 70: - if i % 2 == 0: - for k in range(random.randint(1, 3)): - gente.append((s * random.uniform(WALK - 1.6, WALK - .4), z + random.uniform(.2, 1.4), INK)) - z += 1.5 + 2.2 + z * .12; i += 1 -# bajando a la calzada, hacia el centro -for _ in range(42): - Z = math.exp(random.uniform(math.log(6.5), math.log(70))) - gente.append((random.uniform(-ROAD + .4, ROAD - .4), Z, ORA if random.random() < .22 else INK)) -gente.sort(key=lambda g: -g[1]) -add('') -for X, Z, col in gente: - persona(X, Z, col) -add('') -# salpicaduras sueltas -add('') -for _ in range(40): - add(f'') -add('') +pts = [] +def libre(x, y, s): + return all(math.hypot(x - a, (y - b) * 1.6) > 17 * max(s, t) for a, b, t in pts) +for _ in range(200000): # la figura grande, densa + x, y = random.uniform(400, 1150), random.uniform(240, 890) + if dentro(x, y): + s = .62 + .38 * esc(y) + if libre(x, y, s * 1.35): + pts.append((x, y, s)) +grande = len(pts) +for _ in range(900): # poca gente suelta, por la calle + y = random.uniform(300, 880) + x = random.uniform(edge(-150, y), edge(1750, y)) + s = .62 + .38 * esc(y) + if not dentro(x, y) and libre(x, y, s * 5) and random.random() < .35: + pts.append((x, y, s)) +pts.sort(key=lambda p: p[1]) # de lejos a cerca +add('') +for x, y, s in pts: + presencia(x, y, s, ORA if random.random() < .05 else INK) add('') open(OUT, "w").write("\n".join(o)) +print(f"{len(pts)} presencias ({grande} en la figura grande)", file=sys.stderr)