Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 21

Определить, есть ли участки длины, содержащие определенное количество точек

02.05.2014, 06:54. Показов 1389. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ломаная задана точками (x,y) имеются n других точек определить есть ли участки длины <=l содержащие >=m точек
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2014, 06:54
Ответы с готовыми решениями:

Есть ли возможность рандомно извлечь определенное количество точек из массива PointF
Здрасте! Может подсказать есть ли возможность рэндумно извлечь определенное кол-во точек из массива PointF(массив уже заполнен) и как это...

Найти уравнение прямой содержащие наибольшее количество точек содержащие на прямой
Всем привет, кто может написать программу по условию, удалено модератором Вот условие На плоскости N точек заданы своими координатами. ...

Найти уравнение прямой содержащие наибольшее количество точек содержащие на прямой
То что в тот раз вы мне скинули похожие темы то там не правильно, и не такое условие, изменить я не смог и подставить под свое условие,...

5
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
02.05.2014, 11:14
sofron, откуда такая задачка? Всмысле, как будет проверяться - зрительно или машинно? В общем случае нужно завести натуральный параметр на ломаной, вычислить его для всех "других" точек (которые папали на нее), отсортировать и проанализировать полученный одномерный массив длин D[k], т.е. если существует i, такое, что (D[i + m] - D[i]) <= l, то участки существуют.
1
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 21
02.05.2014, 20:00  [ТС]
Будет проверяться машинно.
И я не понял что за натуральный параметр объясните пожалуйста
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
02.05.2014, 22:58
Лучший ответ Сообщение было отмечено sofron как решение

Решение

sofron, любая гладкая кривая от точки A до B - это одномерное множество точек, поскольку, ее можно растянуть в отрезок. А значит (для R2) существует непрерывная функция γ(t) = {x(t), y(t)} её задающая. Можно, например, подобрать такую γ(t), что γ(0) = A и γ(1) = B. Существует также натуральная параметризация γ(s), такая что для любых двух точек N и M на кривой |γ(s(N)) - γ(s(M))| = длине участка кривой от N до M, в частности, можно положить γ(s=s(A)=0) = 0, γ(s=s(B))=длине всей кривой.

Название: curve.png
Просмотров: 41

Размер: 10.5 Кб
Если захотите - разберетесь. Покажу на примере как можно решить задачу, входные данные из картинки. Точка A - начало кривой. Вычислим для каждого узла кривой длину от начала до узла, это будет массив длин S = {0, AB, AB+BC, AB+BC+CD} = {0, 4.24, 4.24+2.83, 4.24+2.83+2.83} = {0, 4.24, 7.07, 9.9}. 9.9 - это длина всей кривой от A до D.

Как узнать лежит ли точка Q на кривой? Из неравенства треугольника. Последовательно проверяем отрезки ломаной, предположим, что дошли до ВС, вычислим BQ=3, QC=2.23, BC=S[2]-S[1]=7.07-4.24=2.83, т.к. BC < BQ+QC, то не принадлежит.

Рассмотрим точку P: CP=PD=√2=1.41, CD=CP+PD=2√2, а значит точка P принадлежит кривой и соответвует натуральному параметру s = S[2]+CP = 7.07+√2=8.48.

[Для задачи не нужно] Пусть, теперь, наоборот, имеем параметр s=8.48, нужно определить координаты точки P. Пройдемся по массиву S и определим t: S[t] < s < S[t+1] это S[2]=7.07<8.48<9.9=S[3], т.е. точка лежит на отрезке CD и длина CP = 8.48 - S[2]=1.41. В векторной форме имеем: https://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{OP}=\vec{OC}+\vec{CD}\cdot|\vec{CP}|/|\vec{CD}|.

Таким образом получили натуральную параметризацию, как я говорил выше, создадим упорядоченный массив параметров D[i] для всех "других" точек и пройдемся по нему:
C#
1
2
for (int i = 0; i < D.Count - m; i++)
    if ((D[i + m] - D[i]) <= l) { /* Задача имеет положительный ответ */ }
Собственно, я примерно набросал код, Вы можете его "допилить" для Ваших нужд
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace TestConsole
{
    static class MathExt
    {
        public const double Accuracy = 1e-15;
        
        public static bool IsZero(this double x)
        { 
            return Math.Abs(x) < Accuracy; 
        }
 
        public static bool Eq(this double x, double y)
        {
            return (x - y).IsZero();
        }
    }
 
    struct Point
    {
        public double X;
        public double Y;
 
        public Point(double X, double Y) 
        { 
            this.X = X; 
            this.Y = Y; 
        }
 
        public static Point operator +(Point a, Point b)
        {
            return new Point(a.X + b.X, a.Y + b.Y);
        }
 
        public static Point operator -(Point a, Point b)
        {
            return new Point(a.X - b.X, a.Y - b.Y);
        }
 
        public static Point operator *(Point p, double k)
        {
            return new Point(p.X * k, p.Y * k);
        }
 
        public static double Distance(Point a, Point b)
        {
            double dx = a.X - b.X, dy = a.Y - b.Y;
            return Math.Sqrt(dx * dx + dy * dy);
        }
 
        // override Equals by Accuracy
    }
 
    class Path
    {
        Point[] Points;
        double[] Segments;
        
        public Path(params Point[] InitialPoints)
        {
            int n = InitialPoints.Length;
            Points = new Point[n];
            Array.Copy(InitialPoints, Points, n);
 
            Segments = new double[n];
            for (int i = 1; i < n; i++)
            {
                Segments[i] = Segments[i - 1] + Point.Distance(Points[i - 1], Points[i]);
            }
        }
 
        /// <summary>
        /// Возвращает натуральный параметр точки на ломаной,
        /// если точка принадлежит ломаной, иначе -1.0d
        /// </summary>
        public double this[Point p]
        {
            get
            {
                for (int i = 0; i < Points.Length - 1; i++)
                {
                    double a = Point.Distance(Points[i], p);
                    double b = Point.Distance(p, Points[i + 1]);
                    double c = Segments[i + 1] - Segments[i];
                    if (c.Eq(a + b))
                    {
                        return a + i;
                    }
                }
                return -1.0;
            }
        }
 
        /// <summary>Возвращает точку ломаной по натуральному параметру</summary>
        public Point this[double p]
        {
            get
            {
                // Идекс ближайшего левого узла ломаной
                int ip = 0;
                while (Segments[ip + 1] < p) ip++;
 
                // ближайшие левый и правый узел ломаной
                Point L = Points[ip], R = Points[ip + 1]; 
 
                // Длина сегмента ломаной и участка от левого узла до точки
                double sz = Segments[ip + 1] - Segments[ip];
                return sz.IsZero() ? L : L + (R - L) * ((p - Segments[ip]) / sz);
            }
        }
 
        public IEnumerable<Point> AllPoints { get { foreach (var p in Points) yield return p; } }
    }
 
    static class Task
    {
        static void GetRandomInput(out Path Path, out Point[] Points)
        {
            Random rnd = new Random();
            int n = rnd.Next(20, 50);      // Число точек ломаной
            int m = n + rnd.Next(10);   // Число "других" точек
            int k = rnd.Next(n);        // Число "других" точек, которые будут принадлежать ломаной
            double w = 10.0;            // размер квадрата откуда будут браться точки
            
            List<Point> toPath = new List<Point>();
            List<Point> toPoints = new List<Point>();
 
            // Формируем ломаную
            for (int i = 0; i < n; i++)
            {
                toPath.Add(new Point(rnd.NextDouble() * w, rnd.NextDouble() * w));
            }
 
            Path = new Path(toPath.ToArray());
               
            // Добавляем точки с ломаной к "другим"
            for (int i = 0; i < k; i++)
            {
                toPoints.Insert(rnd.Next(toPoints.Count), Path[rnd.NextDouble() * (n - 1)]);
            }
 
            // Добавляем еще несколько произвольных точек к "другим"
            for (int i = k + 1; i < m; i++ )
            {
                toPoints.Insert(rnd.Next(toPoints.Count),
                    new Point(rnd.NextDouble() * w, rnd.NextDouble() * w));
            }
 
            Points = toPoints.ToArray();
        }
 
        static void DrawInput(Path Path, Point[] Points)
        {
            HashSet<Point> hs = new HashSet<Point>();
            foreach (Point p in Path.AllPoints) hs.Add(p);
            foreach (Point p in Points) hs.Add(p);
 
            string tmpl = "{0,6:F2} | {1,6:F2} | {2,-6} | {3,-6}";
            Console.WriteLine(tmpl, "X", "Y", "Кривая", "Другие");
            foreach(Point p in hs)
            {
                Console.WriteLine(tmpl, p.X, p.Y,
                    Path[p] > -1 ? "  +" : "", 
                    Array.IndexOf(Points, p) > -1 ? "  +" : "");
            }
        }
 
        static bool Solve(Path Path, Point[] Points, double l, int m)
        {
            // Параметризуем все точки на кривой
            List<double> D = new List<double>();
            foreach (Point p in Points)
            {
                // Натуральный параметр точки на ломаной
                double d = Path[p];
                if (d < 0) continue;
 
                // Вставляем в порядке возрастания
                bool fl = false;
                for (int i = 0; i < D.Count && !fl; i++)
                    if (fl = D[i] >= d) D.Insert(i, d);
 
                if (!fl) D.Add(d);
            }
 
            bool r = false;
            for (int i = 0; i < D.Count - m && !r; i++)
                r |= (D[i + m] - D[i]) <= l;
 
            return r;
        }
 
        static void Main()
        {
            Point[] points;
            Path path;
 
            GetRandomInput(out path, out points);
            DrawInput(path, points);
 
            Console.WriteLine();
            Console.WriteLine(Solve(path, points, 10.0, 4) ? "Существуют" : "Не существуют");
            Console.ReadLine();
        }
    }
}
3
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2014, 00:44
rRczZZ, гениально. Снимаю шляпу
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 21
04.05.2014, 17:41  [ТС]
Спасибо большое!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2014, 17:41
Помогаю со студенческими работами здесь

Определить сколько дней в году (всего 12 месяцев, в каждом есть определенное количество дней)
Помогите решить задачу пожалуйста

Среди трех точек с координатами (x1,y1), (x2,y2), (x3,y3) определить количество точек, лежащих в третьей четверти
Среди трех точек с координатами (x1,y1), (x2,y2), (x3,y3) определить количество точек, лежащих в третьей четверти

Дано n точек, определить какое максимальное количество точек лежит на одной прямой
Дано n точек, определить какое максимальное количество точек лежит на одной прямой.

Дано n точек, определить какое максимальное количество точек лежит на одной прямой
Дано n точек, определить какое максимальное количество точек лежит на одной прямой. Решите пожалуйста.

Запуск bat-файла определенное количество раз и определенное количество дней
1 есть .bat файл, который запускает некий скрипт. Требуется настроить его так, что бы запуск происходил определенное количество дней. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru