Asosiy mazmunga o'tish

36-dars: Geometriya asoslari

5-darajaOlimpiada — musobaqa mahorati33–40 darslar

Bu darsdan keyin siz

  • vektor ko’paytmasini hisoblaysiz va belgisini o’qiysiz
  • ko’pburchak maydonini butun sonlarda topasiz
  • geometriyada kasr sondan nega qochish kerakligini bilasiz

Avval qo‘lda

~6 daqiqajuftlikdaKatakli qog'oz

Katakli qog’ozda (0,0), (3,1) va (1,3) nuqtalarini belgilang. Birinchisidan ikkinchisiga, so’ng uchinchisiga strelka torting.

Burilish qaysi tomonga? Endi ikkinchi va uchinchi nuqtani almashtirib qaytadan chizing — nima o’zgardi?

Nimani sezishingiz kerak

Yo’nalish teskari bo’ldi. Vektor ko’paytmasi aynan shu farqni ushlaydi: nuqtalar tartibi o’zgarsa, natijaning belgisi o’zgaradi, kattaligi esa o’zgarmaydi.

Kompyuter yopiq. Bu mashq tugamaguncha kod ochilmaydi.

vektor ko'paytmasicross product

Ikki vektor uchun hisoblanadigan son. Tekislikda u (bx−ax)·(cy−ay) − (by−ay)·(cx−ax) ko’rinishida bo’ladi.

Uning uchta ma’nosi bor va hammasi foydali. Belgisi burilish yo’nalishini beradi. Noli uch nuqta bir chiziqda ekanini bildiradi. Moduli esa uchburchak maydonining ikki barobariga teng.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
def kop(ax, ay, bx, by, cx, cy):  return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax)print(kop(0, 0, 1, 0, 1, 1))print(kop(0, 0, 1, 0, 1, -1))print(kop(0, 0, 1, 1, 2, 2))
Javobni ko'rish
1
-1
0

Uchta holat: bir tomonga burilish, boshqa tomonga burilish va bir to'g'ri chiziq. Hammasi butun sonlarda — hech qanday kasr yo'q.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
print(0.1 + 0.2 == 0.3)print(0.1 + 0.2)print(1 == 3 * (1 / 3))
Javobni ko'rish
False
0.30000000000000004
True

Kasr sonlar taqqoslanishi ishonchsiz: gohida to'g'ri, gohida yo'q. Geometriya masalasida bu bitta testda yiqilish degani, va qaysi testda — bilinmaydi.

Masala: n nuqta ichidan nechta uchlik bir to’g’ri chiziqda yotadi? To’liq izlash har uchlikni tekshiradi.

sekin.py
nuqtalar = [(0, 0), (1, 1), (2, 2), (0, 2), (2, 0)]n = len(nuqtalar)soni = 0for i in range(n):  for j in range(i + 1, n):      for k in range(j + 1, n):          ax, ay = nuqtalar[i]          bx, by = nuqtalar[j]          cx, cy = nuqtalar[k]          if (bx - ax) * (cy - ay) - (by - ay) * (cx - ax) == 0:              soni += 1print(soni)

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
nuqtalar = [(0, 0), (1, 1), (2, 2), (0, 2), (2, 0)]n = len(nuqtalar)soni = 0for i in range(n):  for j in range(i + 1, n):      for k in range(j + 1, n):          ax, ay = nuqtalar[i]          bx, by = nuqtalar[j]          cx, cy = nuqtalar[k]          if (bx - ax) * (cy - ay) - (by - ay) * (cx - ax) == 0:              soni += 1print(soni)
Javobni ko'rish
2

Ikkita uchlik: asosiy diagonal va unga perpendikulyar diagonal. Ish hajmi n kub — n = 1000 da 166 million uchlik.

Sig‘adimi?

Bir soniyada taxminan 10⁸ oddiy amal bajariladi.

Yechimn = 120n = 1 000
Har uchlikni ko‘rishn^310⁶sig‘adi10⁹chegarada
Yo‘nalishlarni guruhlashn^214 400sig‘adi10⁶sig‘adi

Yashil — yechim o‘tadi. Sariq — chegarada, konstanta va til muhim bo‘lib qoladi. Qizil — bu yechim bilan bormaydi, boshqasini qidiring.

Har nuqtadan qolganlarga yo’nalish hisoblanadi va bir xillari guruhlanadi. Yo’nalishni solishtirish uchun uni EKUB ga bo’lib normallashtirish kerak — va belgisini ham (34-dars).

tez.py
from math import gcdnuqtalar = [(0, 0), (1, 1), (2, 2), (0, 2), (2, 0)]n = len(nuqtalar)jami = 0for i in range(n):  hisob = {}  for j in range(n):      if i == j:          continue      dx = nuqtalar[j][0] - nuqtalar[i][0]      dy = nuqtalar[j][1] - nuqtalar[i][1]      g = gcd(abs(dx), abs(dy))      dx, dy = dx // g, dy // g      if dx < 0 or (dx == 0 and dy < 0):          dx, dy = -dx, -dy      hisob[(dx, dy)] = hisob.get((dx, dy), 0) + 1  for t in hisob.values():      jami += t * (t - 1) // 2print(jami // 3)

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
from math import gcdnuqtalar = [(0, 0), (1, 1), (2, 2), (0, 2), (2, 0)]n = len(nuqtalar)jami = 0for i in range(n):  hisob = {}  for j in range(n):      if i == j:          continue      dx = nuqtalar[j][0] - nuqtalar[i][0]      dy = nuqtalar[j][1] - nuqtalar[i][1]      g = gcd(abs(dx), abs(dy))      dx, dy = dx // g, dy // g      if dx < 0 or (dx == 0 and dy < 0):          dx, dy = -dx, -dy      hisob[(dx, dy)] = hisob.get((dx, dy), 0) + 1  for t in hisob.values():      jami += t * (t - 1) // 2print(jami // 3)
Javobni ko'rish
2

Javob bir xil. Oxirida uchga bo'linadi, chunki har uchlik AYNAN UCH MARTA — har uchidan bir marta — sanaladi.

Belgini normallashtirish nega kerak: (2, 1) va (−2, −1) bir chiziqning ikki tomoni. Ularni bir guruhga tushirmasa, chiziqdagi nuqtalar ikki guruhga bo’linib ketadi.

Xuddi shu ko’paytma ko’pburchak maydonini ham beradi. Uchlarni tartib bilan aylanib, qo’shni juftliklarning ko’paytmasini qo’shamiz.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
nuqtalar = [(0, 0), (4, 0), (4, 3), (0, 3)]n = len(nuqtalar)ikki_yuz = 0for i in range(n):  x1, y1 = nuqtalar[i]  x2, y2 = nuqtalar[(i + 1) % n]  ikki_yuz += x1 * y2 - x2 * y1print(abs(ikki_yuz), abs(ikki_yuz) / 2)
Javobni ko'rish
24 12.0

4 x 3 to'rtburchak maydoni 12. Formula maydonning IKKI BAROBARINI beradi — shuning uchun natija butun son bo'lib qoladi va uni bo'lmasdan solishtirish mumkin.

Vizualda har uchlik uchun ko’paytma hisoblanadi. Belgi burilish tomonini aytishini kuzating.

Vektor ko'paytmasi va yo'nalish

Har qadamda uchta nuqta olinadi. Ko'paytma belgisi burilish tomonini aytadi.

Uch nuqta uchun vektor ko'paytmasi hisoblanadi; uning belgisi burilish yo'nalishini, noli esa bir chiziqdaligini bildiradi.

Algoritmning har qadami quyidagi ro‘yxatda matn sifatida ham berilgan — vizual faqat shu qadamlarni chizadi, yangi ma’lumot qo‘shmaydi.

  1. To'rt nuqta. Har uchlik uchun bitta savol: A dan B ga, so'ng C ga borganda burilish qay tomonga?
  2. A, B, C: ko'paytma 1848 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
  3. A, B, D: ko'paytma 2684 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
  4. A, C, D: ko'paytma 4444 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
  5. B, C, D: ko'paytma 3608 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
  6. Belgining o'zi yetadi: aniq qiymat kerak emas. Shuning uchun burchak yoki og'ish hisoblanmaydi — ular kasr son va aniqlik yo'qotadi.
ABCD

To'rt nuqta. Har uchlik uchun bitta savol: A dan B ga, so'ng C ga borganda burilish qay tomonga?

Ko'rilgan uchlik0

1/6

Tuzoq — xatoni toping

36 / 40

MasalaUch nuqta bir to'g'ri chiziqda yotadimi?

Taklif qilingan yechim

Bu javobning 2-qismi noto'g'ri. Ikki muammo bir qatorda. Birinchisi: x2 == x1 bo'lganda nolga bo'lish — vertikal chiziqda yechim yiqiladi. Ikkinchisi: og'ish kasr son, uni tenglikka solishtirish ishonchsiz. To'g'risi: vektor ko'paytmasi nolga tengmi — butun sonlarda, bo'lishsiz.

Javobning qaysi qismi noto'g'ri? Bosib belgilang.

1Vektor ko'paytmasining uchta ma'nosi qanday?

Javobni ko'rish

Belgisi — burilish yo’nalishi, noli — bir chiziqdaligi, moduli — uchburchak maydonining ikki barobari.

2Nega og'ish (dy/dx) ishlatilmaydi?

Javobni ko'rish

Ikki sabab: vertikal chiziqda nolga bo’lish va kasr sonlarni taqqoslash ishonchsizligi.

3Yo'nalishni normallashtirishda nega belgi ham to'g'rilanadi?

Javobni ko'rish

(2, 1) va (−2, −1) bir chiziqning ikki tomoni. Ularni bir guruhga tushirmasa, chiziqdagi nuqtalar ikkiga bo’linib ketadi.

4Nega uchliklar soni oxirida uchga bo'linadi?

Javobni ko'rish

Har uchlik uchta marta sanaladi — uning har uchidan bir marta.

5Nega maydon emas, uning ikki barobari qaytariladi?

Javobni ko'rish

2S har doim butun son. Butun sonlarni solishtirish aniq, kasr sonlarni solishtirish esa emas.

Masalalar

3 ta

  • Point Location TestCSES 2189oson

    To‘g‘ridan-to‘g‘ri vektor ko‘paytmasi belgisi. Bo‘lish ishlatmang.

  • Polygon AreaCSES 2191oson

    Darsdagi formula. Javob ikki barobar maydon sifatida so‘raladi — bu tasodif emas.

  • Convex HullCSES 2195qiyin

    Nuqtalarni saralang va stek bilan yuring (11-dars). Har qadamda burilish yo‘nalishi tekshiriladi.

Lokal mashq: mashqlar/36-uchliklar/ — masala matni, testlar va tekshir.py. Avval sekin.py ni o‘zingiz yozing, keyin tayyorini oching.

Topshiriq — darajangizni tanlang

Asos · 5–7-sinf — Vizual va aniq ko'rsatmali

Katakli qog’ozda uchta nuqta olib, vektor ko’paytmasini qo’lda hisoblang. Keyin nuqtalarning tartibini o’zgartirib qayta hisoblang — belgi qanday o’zgardi?

Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz

36-uchliklar masalasini yeching. sekin.py (n³) va tez.py (n²) vaqtini n = 110 da solishtiring.

Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan

Ko’pburchak maydoni formulasini (0,0), (4,0), (4,3), (0,3) uchun teskari tartibda hisoblang — natija manfiy bo’ladi. Nega? Bu belgidan qanday foydalanish mumkin?

Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.