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
“Avval qo’lda” bo'limiga havolaAvval qo‘lda
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’paytmasi
“Vektor ko’paytmasi” bo'limiga havolavektor 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.
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))Haqiqiy natija:
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.
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.
print(0.1 + 0.2 == 0.3)print(0.1 + 0.2)print(1 == 3 * (1 / 3))Haqiqiy natija:
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.
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.
Sekin yechim
“Sekin yechim” bo'limiga havolaMasala: n nuqta ichidan nechta uchlik bir to’g’ri chiziqda yotadi?
To’liq izlash har uchlikni tekshiradi.
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.
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)Haqiqiy natija:
2
Ikkita uchlik: asosiy diagonal va unga perpendikulyar diagonal. Ish hajmi n kub — n = 1000 da 166 million uchlik.
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.
| Yechim | n = 120 | n = 1 000 |
|---|---|---|
Har uchlikni ko‘rishn^3 | 10⁶sig‘adi | 10⁹chegarada |
Yo‘nalishlarni guruhlashn^2 | 14 400sig‘adi | 10⁶sig‘adi |
Yashil — yechim o‘tadi. Sariq — chegarada, konstanta va til muhim bo‘lib qoladi. Qizil — bu yechim bilan bormaydi, boshqasini qidiring.
Tez yechim
“Tez yechim” bo'limiga havolaHar 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).
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.
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)Haqiqiy natija:
2
Javob bir xil. Oxirida uchga bo'linadi, chunki har uchlik AYNAN UCH MARTA — har uchidan bir marta — sanaladi.
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.
Ko’pburchak maydoni
“Ko’pburchak maydoni” bo'limiga havolaXuddi 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.
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)Haqiqiy natija:
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.
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.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaVizualda 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.
- To'rt nuqta. Har uchlik uchun bitta savol: A dan B ga, so'ng C ga borganda burilish qay tomonga?
- A, B, C: ko'paytma 1848 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
- A, B, D: ko'paytma 2684 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
- A, C, D: ko'paytma 4444 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
- B, C, D: ko'paytma 3608 — burilish BIR tomonga. Butun sonlarda hisoblandi, hech qanday kasr yo'q.
- Belgining o'zi yetadi: aniq qiymat kerak emas. Shuning uchun burchak yoki og'ish hisoblanmaydi — ular kasr son va aniqlik yo'qotadi.
To'rt nuqta. Har uchlik uchun bitta savol: A dan B ga, so'ng C ga borganda burilish qay tomonga?
Ko'rilgan uchlik0
Xatoni toping
“Xatoni toping” bo'limiga havolaTuzoq — 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.
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.
Uchinchi qadam ham nozik: kasr sonlarni == bilan solishtirish
deyarli har doim xato. Geometriyada qoida bitta — bo’lish yo’q,
ko’paytirish bor.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Vektor 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
“Masalalar” bo'limiga havolaMasalalar
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
“Topshiriq” bo'limiga havolaTopshiriq — 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.